以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  饼图图系编号和数据点编号问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=184519)

--  作者:onlinech
--  发布时间:2022/12/12 9:14:00
--  饼图图系编号和数据点编号问题
1、如何实现鼠标移动某个图例时,动态实时显示此图例的内容,我现在使用的messagebox.show,每次移动都要“确认”一下,太麻烦了
2、不要显示是第几个图系,而是显示这个图系的名称,例:9号场地,1785620
3、图和图例所在位置的颜色可以修改
4、右侧图例可以多显示几行,不要分成2列

图片点击可在新窗口打开查看此主题相关图片如下:搜狗截图20221212090741.png
图片点击可在新窗口打开查看

代码:
Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Dim t As Table = Tables("统计表4") \'定义一个变量t引用数据表--------------
Dim sm As Integer = t.Compute("Sum(净重)") \'计算总数量
Chart = Forms("窗口2").Controls("Chart1") \' 引用窗口中的图表--------------
Chart.VisualEffect = True \'加上这一行,让你的图表更漂亮
Chart.ChartType = ChartTypeEnum.Pie \'图表1类型改为Bar(条形)
For Each r As Row In t.Rows
    Series = Chart.SeriesList.Add() \'增加一个图系
    Series.Length = 1 \'一个系列只能包括一个值
\'    Series.Text = r("发货单位") & "(" & r("净重") & ")" \'设置图系的标题
     Series.Text = r("发货单位") \'设置图系的标题   
    Series.Y(0) = r("净重") \'指定值
    Series.DataLabelText = Math.Round(r("净重") * 100 / sm, 2) & "%" \'计算百分比
Next
Chart.LegendVisible = True \'显示图列
Chart.LegendCompass = CompassEnum.East \'图列显示在东方(右方)

事件MouseMove:
Dim s As Integer \'定义存储图系编号的变量
Dim p As Integer \'定义存储数据点编号的变量
Dim Chart As WinForm.Chart = Forms("窗口2").Controls("Chart1") \'获得Chart对象的引用------------
If Chart.CoordToDataIndex(e.x, e.y , s , p) Then \'如果鼠标位置存在有效的图序和数据点
    Dim Series As WinForm.ChartSeries = Chart.SeriesList(s) \'获得鼠标位置的图序
    Dim msg As String
    msg = "单击的是第" & (s + 1) & "个图系,该点的值为 " & Series.Y(p)
    Messagebox.Show(msg, "提示")
End If

--  作者:有点蓝
--  发布时间:2022/12/12 9:19:00
--  
1、把messagebox的代码改为自己需要显示的其它功能
2、根据第几个到表格里取对应的行即可,比如第4个图系,就是第4行的数据
4、无法控制

--  作者:onlinech
--  发布时间:2022/12/20 10:34:00
--  
可能没表述清楚,我是想鼠标移动到某个图例时就显示这个图例的相关信息,而不是用鼠标点击的方式
--  作者:有点蓝
--  发布时间:2022/12/20 10:51:00
--  
一样的用法,代码放到鼠标移动事件即可
--  作者:onlinech
--  发布时间:2022/12/20 11:32:00
--  
放在MouseMove事件中,还是要点击“确认”按钮后,才能再显示其它图例的信息
我是想鼠标移动到哪个图例就显示哪个图例的(动态),如果超过这个饼形图表,就不显示,不再手动去点击“确认”按钮

--  作者:有点蓝
--  发布时间:2022/12/20 11:36:00
--  
这种直接使用TooltipText就行了:http://www.foxtable.com/webhelp/topics/0982.htm
--  作者:onlinech
--  发布时间:2022/12/21 12:28:00
--  
在没有图例的情况下,鼠标移动到图表的范围会报错,如何不显示报错信息,或是显示一段自定义文字呢?
MouseMove代码:

Dim s As Integer \'定义存储图系编号的变量

Dim p As Integer \'定义存储数据点编号的变量

Dim Chart As WinForm.Chart = Forms("当日实时").Controls("Chart2") \'获得Chart对象的引用------------

If Chart.CoordToDataIndex(e.x, e.y , s , p) Then \'如果鼠标位置存在有效的图序和数据点

    Dim Series As WinForm.ChartSeries = Chart.SeriesList(s) \'获得鼠标位置的图序

    Series.TooltipText = "发货单位:" & DataTables("发货单位统计").DataRows(s)("发货单位") & vbcrlf & "重量:" & Series.Y(p) / 1000 & "吨"

Else

    Series.TooltipText = "今日无数据"

End If


此主题相关图片如下:搜狗截图20221221075825.png
按此在新窗口浏览图片



此主题相关图片如下:搜狗截图20221221125506.png
按此在新窗口浏览图片
当这个统计出来的表无任何数据时,才会报错。

[此贴子已经被作者于2022/12/21 13:03:51编辑过]

--  作者:有点蓝
--  发布时间:2022/12/21 13:33:00
--  
If Chart.CoordToDataIndex(e.x, e.y , s , p) andalso Tables("发货单位统计").Rows.count > 0
--  作者:onlinech
--  发布时间:2022/12/21 17:59:00
--  
代码修改如下:
Dim s As Integer 
Dim p As Integer 
Dim Chart As WinForm.Chart = Forms("当日实时").Controls("Chart2") 
MessageBox.Show("1")
If Chart.CoordToDataIndex(e.x, e.y , s , p) AndAlso DataTables("发货单位统计").dataRows.count > 0 Then \'如果鼠标位置存在有效的图序和数据点,且表不为空
    MessageBox.Show("2")
    Dim Series As WinForm.ChartSeries = Chart.SeriesList(s) 
    Series.TooltipText = "发货单位:" & DataTables("发货单位统计").DataRows(s)("发货单位") & vbcrlf & "重量:" & Series.Y(p) / 1000 & "吨"
Else
    MessageBox.Show("3")
End If

还是报一样的错,只能看断点1,断点2和3都没执行

--  作者:onlinech
--  发布时间:2022/12/22 8:21:00
--  
已解决

If Tables("发货单位统计").Rows.count > 0 AndAlso Chart.CoordToDataIndex(e.x, e.y , s , p) Then

谢谢