You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MSChart堆叠百分比柱状图中显示绑定的用户名数据?

解决MSChart堆叠柱状图Tooltip/点击事件显示额外绑定数据(如用户名)的问题

嘿,我明白你现在的需求——在100%堆叠柱状图里,鼠标悬停或点击系列时,除了显示数值总和,还要能拿到绑定的原始数据比如用户名对吧?咱们来一步步搞定这个问题。

首先,先指出你当前代码的局限:你用DataBindCrossTable自动绑定数据,虽然快捷,但这种方式没法直接把额外的用户信息关联到每个数据点上,所以Tooltip只能用MSChart提供的内置变量(比如#VALY),没法获取自定义的非数值数据。

接下来给出具体的解决方案:

核心思路

我们需要手动创建Series和DataPoint,并把每个分组对应的用户数据存储到DataPoint的Tag属性中,这样不管是Tooltip还是点击事件,都能轻松取出这些额外信息。

步骤1:修改数据统计逻辑,保留用户关联信息

原代码里只统计了每个四分位分组的数量,现在我们要同时记录每个分组对应的用户列表。比如,把原来的计数逻辑改成存储用户名到列表里:

' 先定义一个自定义类,用来存储分组的数量和用户列表
Public Class GroupData
    Public Property Count As Integer
    Public Property Users As List(Of String)
End Class

' 以TEMPO_INAPTIDAO的统计为例,替换原有的somaS等变量
Dim listaS As New List(Of String)()
Dim listaH As New List(Of String)()
Dim listaC As New List(Of String)()
Dim listaD As New List(Of String)()

For Each linha In dtTest1.Rows
    Dim tempo = Convert.ToDouble(linha("TEMPO_INAPTIDAO"))
    Dim userName = linha("USERNAME").ToString() ' 假设你的数据表包含USERNAME字段
    If tempo < QuartisTempoInaptidao.Item1 Then
        listaS.Add(userName)
    ElseIf tempo >= QuartisTempoInaptidao.Item1 AndAlso tempo < QuartisTempoInaptidao.Item2 Then
        listaH.Add(userName)
    ElseIf tempo >= QuartisTempoInaptidao.Item2 AndAlso tempo < QuartisTempoInaptidao.Item3 Then
        listaC.Add(userName)
    ElseIf tempo >= QuartisTempoInaptidao.Item3 Then
        listaD.Add(userName)
    End If
Next

' 修改tabelafinal的结构,存储GroupData对象而非单纯的数字
tabelafinal.Columns.Remove("VALORES")
tabelafinal.Columns.Add("GroupData", GetType(GroupData))
tabelafinal.Rows.Add(New GroupData With {.Count = listaS.Count, .Users = listaS}, "TM_INAP", "D")
tabelafinal.Rows.Add(New GroupData With {.Count = listaH.Count, .Users = listaH}, "TM_INAP", "C")
tabelafinal.Rows.Add(New GroupData With {.Count = listaC.Count, .Users = listaC}, "TM_INAP", "H")
tabelafinal.Rows.Add(New GroupData With {.Count = listaD.Count, .Users = listaD}, "TM_INAP", "S")

' 其他分组(TEMPO_PARABENS、TEMPO_RECUSA等)的统计逻辑同理修改

步骤2:手动创建Series和DataPoint,附加Tag数据

放弃DataBindCrossTable,手动遍历tabelafinal创建每个Series和DataPoint,把包含用户信息的GroupData存入DataPoint的Tag:

Chart1.Series.Clear() ' 清空现有系列

' 按COR字段分组创建Series
Dim corGroups = tabelafinal.AsEnumerable().GroupBy(Function(r) r("COR").ToString())
For Each corGroup In corGroups
    Dim series = New Series(corGroup.Key)
    series.ChartType = SeriesChartType.StackedColumn100
    Chart1.Series.Add(series)
    
    ' 为每个COLUNA添加DataPoint
    For Each row In corGroup
        Dim groupData = DirectCast(row("GroupData"), GroupData)
        Dim dp = New DataPoint()
        dp.AxisLabel = row("COLUNA").ToString()
        dp.YValues = New Double() {groupData.Count}
        dp.Tag = groupData ' 将用户信息存入Tag
        
        ' 自定义Tooltip,显示数量和用户名列表
        dp.ToolTip = $"Pessoas = {groupData.Count}{Environment.NewLine}Usuários: {String.Join(", ", groupData.Users)}"
        series.Points.Add(dp)
    Next
Next

步骤3:处理点击事件显示详细信息

如果需要点击数据点时弹出更完整的用户信息,可以添加Chart1.MouseClick事件:

Private Sub Chart1_MouseClick(sender As Object, e As MouseEventArgs) Handles Chart1.MouseClick
    Dim hitTestResult = Chart1.HitTest(e.X, e.Y)
    If hitTestResult.ChartElementType = ChartElementType.DataPoint Then
        Dim dp = hitTestResult.Point
        Dim groupData = DirectCast(dp.Tag, GroupData)
        ' 弹出MessageBox显示详细信息,也可以显示在窗体的其他控件中
        MessageBox.Show(
            $"Grupo: {dp.AxisLabel}{Environment.NewLine}" &
            $"Quantidade: {groupData.Count}{Environment.NewLine}" &
            $"Usuários:{Environment.NewLine}{String.Join(Environment.NewLine, groupData.Users)}",
            "Detalhes do Grupo"
        )
    End If
End Sub

修复原代码中的逻辑错误

我注意到你原代码里的几个循环存在条件误用的问题,比如统计TEMPO_RECUSA时,判断条件里错误引用了TEMPO_PARABENS:

' 原错误代码:
ElseIf linha("TEMPO_RECUSA") >= QuartisTempoRecusa.Item1 AndAlso linha("TEMPO_PARABENS") < QuartisTempoRecusa.Item2 Then
' 修正后:
ElseIf linha("TEMPO_RECUSA") >= QuartisTempoRecusa.Item1 AndAlso linha("TEMPO_RECUSA") < QuartisTempoRecusa.Item2 Then

同样的错误在TEMPO_SEMDADOS和TEMPO_CALLBACK的统计循环里也存在,记得修正,否则统计结果会不准确。

这样修改后,你的堆叠柱状图就能在鼠标悬停时显示数量和对应的用户名,点击时还能弹出详细的用户列表啦!

内容的提问来源于stack exchange,提问作者Pedro Nassetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:46:19