图表事件
本节的可以参考CaseStudy目录下的文件“图表事件.Table”
Chart控件现在可以响应事件,让你的图表活起来。
Chart支持的事件有:
事件 | 触发条件 | 说明 |
MouseClik | 单击某个图系或数据点后执行 | e参数属性
|
MouseDoubleClik | 双击某个图系或数据点后执行 | |
MouseHover | 鼠标悬停在某个图系或数据点后执行 | |
MouseDown | 在某个图系或数据点上按下鼠标后执行 | |
MouseUp | 在某个图系或数据点上松开鼠标后执行 | |
MouseMove | 鼠标经过某个图系或数据点时执行 | |
ShowTooltip | 显示提示信息的时候执行 | e参数属性
|
示例一
例如有个饼图,希望单击某个扇形,能使其离开或回到圆心:
要实现上述要求,只需在Click事件加上代码:
If
e.SeriesIndex >= 0
Then
Dim
chart
As
WinForm.Chart = e.Sender
Dim
series
As
WinForm.ChartSeries = chart.SeriesList(e.SeriesIndex)
If
series.Offset = 0
Then
series.Offset = 30
Else
series.Offset = 0
End
If
End
If
示例二
这次复杂点,假定有一个数据表如下:
希望根据这个数据表生成一个条形图,要求:
1、单击某个条形图时,数据表的焦点能自动跳转到对应的单元格
2、鼠标悬停在某个条形图上的时候,能显示提示信息,并判断用户是否按下Ctrl键,并据此显示不同的提示信息:
不按Ctrl键悬停:
按Ctrl键悬停:
设计步骤
1、在窗口的AfterLoad事件加上代码:
Dim
Chart
As
WinForm.Chart
'定义一个图表变量
Dim
Series
As
WinForm.ChartSeries
'定义一个图系变量
Dim
t
As
Table = Tables("技术分析")
'定义一个变量t引用数据表
Chart = e.Form.Controls("Chart1")
'
引用窗口中的图表
Chart.ChartType = ChartTypeEnum.Bar
'图表类型改为Bar(条形)
Chart.DataSource =
"技术分析"
'设置绑定表
Chart.SeriesList.Clear()
'清除图表原来的图系
For
Each
c
As
Col
In
t.Cols
If
c.Name <>
"技术"
Then
Series = Chart.SeriesList.Add()
'增加一个图系
Series.Text = c.Name
'设置图系的标题
Series.X.DataField =
"技术"
'X轴绑定到产品列
Series.Y.DataField = c.Name
'设置Y轴的绑定列
End
If
Next
Chart.AxisY.Min = 0
'Y轴最小值
Chart.VisualEffect =
True
'加上这一行,让你的图表更漂亮
Chart.LegendVisible =
True
'显示图列
Chart.LegendCompass = CompassEnum.South
'图列显示在南方(底端)
Chart.Style.BackColor = Color.White
'控件背景颜色
Chart.Style.Border.BorderStyle = C1Chart.BorderStyleEnum.None
'去掉控件边框
Chart.ChartAreaStyle.Border.BorderStyle = C1Chart.BorderStyleEnum.None
'去掉图表边框
2、将Chart控件的ShowToolTip事件代码设置为:
Dim
cht
As
WinForm.Chart = e.Sender
If
e.SeriesIndex >= 0
AndAlso
e.PointIndex >= 0
Then
'如多是有效的数据点
Dim
info
As
String
If
ModifierKey = Keys.Control
Then
'如果按下了Ctrl键
Dim
r
As
Row = Tables("技术分析").rows(e.PointIndex)
'在绑定列的时候,e.PointsIndex等于行号
info = r("技术")
For
Each
cl
As
Col
In
Tables("技术分析").Cols
If
cl.Name <>
"技术"
Then
info = info & vbCrLf & cl.Name &
":"
& r(cl.Name)
End
If
Next
Else
Dim
nm
As
String
= cht.SeriesList(e.SeriesIndex).Y.DataField
'获取图系对应的选手名
info =
"姓名:"
& nm
For
Each
r
As
Row
In
Tables("技术分析").Rows
info = info & vbCrLf & r("技术")
&
":"
& r(nm)
Next
End
If
If
info >
""
Then
e.ToolTipText = info
End
If
End
If
3、将Chart控件的MoueClick事件代码设置为:
Dim
cht
As
WinForm.Chart = e.Sender
If
e.SeriesIndex >= 0
AndAlso
e.PointsIndex >= 0
Then
'如多点击了有效的数据点
Dim
nm
As
String
= cht.SeriesList(e.SeriesIndex).Y.DataField
'获取图系对应的选手名,也就是列名
Dim
c
As
Integer
= Tables("技术分析").Cols(nm).Index
Tables("技术分析").Select(e.PointsIndex,
c)
'在绑定表的时候,e.PointsIndex等于行号
End
If
示例三
如果不希望悬停显示提示信息,而是希望按下鼠标的的时候显示,且按下鼠标左键和右键能分别显示不同的信息
可以删除ShowToolTip和MoueClick事件中的代码,然后将MouseDown事件代码设置为:
Dim
cht
As
WinForm.Chart = e.Sender
cht.HideToolTip()
'隐藏之前的提示信息
If
e.SeriesIndex >= 0
AndAlso
e.PointsIndex >= 0
Then
'如多点击了有效的数据点
Dim
info
As
String
If
e.Button = MouseButtons.Left
Then
'如果按下的是鼠标坐标
Dim
r
As
Row = Tables("技术分析").rows(e.PointsIndex)
'在绑定表的时候,e.PointsIndex等于行号
info = r("技术")
For
Each
cl
As
Col
In
Tables("技术分析").Cols
If
cl.Name <>
"技术"
Then
info = info & vbCrLf & cl.Name &
":"
& r(cl.Name)
End
If
Next
ElseIf
e.Button = MouseButtons.Right
Then
'如果按下的是鼠标右键
Dim
nm
As
String
= cht.SeriesList(e.SeriesIndex).Y.DataField
'获取图系对应的选手名
info =
"姓名:"
& nm
For
Each
r
As
Row
In
Tables("技术分析").Rows
info = info & vbCrLf & r("技术")
&
":"
& r(nm)
Next
End
If
If
info >
""
Then
cht.ShowToolTip(info, e.X, e.Y, 5000)
'在鼠标位置显示信息,5秒后自动关闭
End
If
End
If
感觉这样更方便点。