将数据界定到MSCHART,因此我可以返回非数据值值



我正在尝试构建一个由最高100%堆叠的列组成的图表,每个列有4个系列,一旦构建,一旦悬停在系列上,返回所有绑定的数据(在这种情况下,用户名(

我非常接近我想要的东西,但是工具提示只显示了预期的总和,但我不知道该如何进行。如果有另一种方式通过悬停的方式,例如单击,在单击中,我会认识到该系列以及所有那里的系列,这将极大地帮助

我现在拥有的

我想要的

查找它后,我以这种方式构建了图表:(现在是一场代码噩梦,但我以后将正确地对所有内容进行正确的方法(

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Dim sql As New SqlCommand(my query, my connector)
connect()
Dim rs = sql.ExecuteReader
Dim dtTest1 As DataTable = New DataTable
If rs.Read Then
   dtTest1.Load(rs)
End If
disconnect()
    Dim arrayTempoCallback(dtTest1.Rows.Count) As Double
    Dim arrayTempoInaptidao(dtTest1.Rows.Count) As Double
    Dim arrayTempoParabens(dtTest1.Rows.Count) As Double
    Dim arrayTempoRecusa(dtTest1.Rows.Count) As Double
    Dim arrayTempoSemDados(dtTest1.Rows.Count) As Double
    For Each item In dtTest1.Rows
        arrayTempoCallback(dtTest1.Rows.IndexOf(item)) = item("TEMPO_CALLBACK")
        arrayTempoInaptidao(dtTest1.Rows.IndexOf(item)) = item("TEMPO_INAPTIDAO")
        arrayTempoParabens(dtTest1.Rows.IndexOf(item)) = item("TEMPO_PARABENS")
        arrayTempoRecusa(dtTest1.Rows.IndexOf(item)) = item("TEMPO_RECUSA")
        arrayTempoSemDados(dtTest1.Rows.IndexOf(item)) = item("TEMPO_SEMDADOS")
    Next
    Dim QuartisCallBack = Quartiles(arrayTempoCallback)
    Dim QuartisTempoInaptidao = Quartiles(arrayTempoInaptidao)
    Dim QuartisTempoParabens = Quartiles(arrayTempoParabens)
    Dim QuartisTempoRecusa = Quartiles(arrayTempoRecusa)
    Dim QuartisTempoSemDados = Quartiles(arrayTempoSemDados)
    Dim tabelafinal As New DataTable
    tabelafinal.Columns.Add("VALORES", GetType(String))
    tabelafinal.Columns.Add("COLUNA", GetType(String))
    tabelafinal.Columns.Add("COR", GetType(String))
    Dim somaS As Integer = 0
    Dim somaH As Integer = 0
    Dim somaC As Integer = 0
    Dim somaD As Integer = 0
    For Each linha In dtTest1.Rows
        If linha("TEMPO_INAPTIDAO") < QuartisTempoInaptidao.Item1 Then
            somaS += 1
        ElseIf linha("TEMPO_INAPTIDAO") >= QuartisTempoInaptidao.Item1 AndAlso linha("TEMPO_INAPTIDAO") < QuartisTempoInaptidao.Item2 Then
            somaH += 1
        ElseIf linha("TEMPO_INAPTIDAO") >= QuartisTempoInaptidao.Item2 AndAlso linha("TEMPO_INAPTIDAO") < QuartisTempoInaptidao.Item3 Then
            somaC += 1
        ElseIf linha("TEMPO_INAPTIDAO") >= QuartisTempoInaptidao.Item3 Then
            somaD += 1
        End If
    Next
    tabelafinal.Rows.Add(somaS, "TM_INAP", "D")
    tabelafinal.Rows.Add(somaH, "TM_INAP", "C")
    tabelafinal.Rows.Add(somaC, "TM_INAP", "H")
    tabelafinal.Rows.Add(somaD, "TM_INAP", "S")
    somaC = somaD = somaH = somaS = 0
    For Each linha In dtTest1.Rows
        If linha("TEMPO_PARABENS") < QuartisTempoParabens.Item1 Then
            somaS += 1
        ElseIf linha("TEMPO_PARABENS") >= QuartisTempoParabens.Item1 AndAlso linha("TEMPO_PARABENS") < QuartisTempoParabens.Item2 Then
            somaH += 1
        ElseIf linha("TEMPO_PARABENS") >= QuartisTempoParabens.Item2 AndAlso linha("TEMPO_PARABENS") < QuartisTempoParabens.Item3 Then
            somaC += 1
        ElseIf linha("TEMPO_PARABENS") >= QuartisTempoParabens.Item3 Then
            somaD += 1
        End If
    Next
    tabelafinal.Rows.Add(somaS, "TM_PARABENS", "S")
    tabelafinal.Rows.Add(somaH, "TM_PARABENS", "H")
    tabelafinal.Rows.Add(somaC, "TM_PARABENS", "C")
    tabelafinal.Rows.Add(somaD, "TM_PARABENS", "D")
    somaC = somaD = somaH = somaS = 0
    For Each linha In dtTest1.Rows
        If linha("TEMPO_RECUSA") < QuartisTempoRecusa.Item1 Then
            somaS += 1
        ElseIf linha("TEMPO_RECUSA") >= QuartisTempoRecusa.Item1 AndAlso linha("TEMPO_PARABENS") < QuartisTempoRecusa.Item2 Then
            somaH += 1
        ElseIf linha("TEMPO_RECUSA") >= QuartisTempoRecusa.Item2 AndAlso linha("TEMPO_PARABENS") < QuartisTempoRecusa.Item3 Then
            somaC += 1
        ElseIf linha("TEMPO_RECUSA") >= QuartisTempoRecusa.Item3 Then
            somaD += 1
        End If
    Next
    tabelafinal.Rows.Add(somaS, "TM_RECUSA", "S")
    tabelafinal.Rows.Add(somaH, "TM_RECUSA", "H")
    tabelafinal.Rows.Add(somaC, "TM_RECUSA", "C")
    tabelafinal.Rows.Add(somaD, "TM_RECUSA", "D")
    somaC = somaD = somaH = somaS = 0
    For Each linha In dtTest1.Rows
        If linha("TEMPO_SEMDADOS") < QuartisTempoSemDados.Item1 Then
            somaS += 1
        ElseIf linha("TEMPO_SEMDADOS") >= QuartisTempoSemDados.Item1 AndAlso linha("TEMPO_PARABENS") < QuartisTempoSemDados.Item2 Then
            somaH += 1
        ElseIf linha("TEMPO_SEMDADOS") >= QuartisTempoSemDados.Item2 AndAlso linha("TEMPO_PARABENS") < QuartisTempoSemDados.Item3 Then
            somaC += 1
        ElseIf linha("TEMPO_SEMDADOS") >= QuartisTempoSemDados.Item3 Then
            somaD += 1
        End If
    Next
    Dim somaFinalSemDadosS As Integer = If(somaS < 0, 0, somaS)
    Dim somaFinalSemDadosH As Integer = If(somaH < 0, 0, somaH)
    Dim somaFinalSemDadosC As Integer = If(somaC < 0, 0, somaC)
    Dim somaFinalSemDadosD As Integer = If(somaD < 0, 0, somaD)
    tabelafinal.Rows.Add(somaFinalSemDadosS, "TM_SEMDADOS", "S")
    tabelafinal.Rows.Add(somaFinalSemDadosH, "TM_SEMDADOS", "H")
    tabelafinal.Rows.Add(somaFinalSemDadosC, "TM_SEMDADOS", "C")
    tabelafinal.Rows.Add(somaFinalSemDadosD, "TM_SEMDADOS", "D")
    somaC = somaD = somaH = somaS = 0
    For Each linha In dtTest1.Rows
        If linha("TEMPO_CALLBACK") < QuartisCallBack.Item1 Then
            somaS += 1
        ElseIf linha("TEMPO_CALLBACK") >= QuartisCallBack.Item1 AndAlso linha("TEMPO_PARABENS") < QuartisCallBack.Item2 Then
            somaH += 1
        ElseIf linha("TEMPO_CALLBACK") >= QuartisCallBack.Item2 AndAlso linha("TEMPO_PARABENS") < QuartisCallBack.Item3 Then
            somaC += 1
        ElseIf linha("TEMPO_CALLBACK") >= QuartisCallBack.Item3 Then
            somaD += 1
        End If
    Next
    Dim somaFinalCallBackS As Integer = If(somaS < 0, 0, somaS)
    Dim somaFinalCallBackH As Integer = If(somaH < 0, 0, somaH)
    Dim somaFinalCallBackC As Integer = If(somaC < 0, 0, somaC)
    Dim somaFinalCallBackD As Integer = If(somaD < 0, 0, somaD)
    tabelafinal.Rows.Add(somaFinalCallBackS, "TEMPO_CALLBACK", "S")
    tabelafinal.Rows.Add(somaFinalCallBackH, "TEMPO_CALLBACK", "H")
    tabelafinal.Rows.Add(somaFinalCallBackC, "TEMPO_CALLBACK", "C")
    tabelafinal.Rows.Add(somaFinalCallBackD, "TEMPO_CALLBACK", "D")
    Dim dv As DataView = New DataView(tabelafinal)
    Chart1.AlignDataPointsByAxisLabel()
    Chart1.DataBindCrossTable(dv, "COR", "COLUNA", "VALORES", "")
    For Each cs As Series In Chart1.Series
        cs.ChartType = SeriesChartType.StackedColumn100
        cs.ToolTip = "Pessoas = #VALY"
    Next
End Sub
Friend Function Quartiles(ByVal afVal As Double()) As Tuple(Of Double, Double, Double)
    Dim iSize As Integer = afVal.Length
    System.Array.Sort(afVal)
    Dim iMid As Integer = iSize / 2
    Dim fQ1 As Double = 0
    Dim fQ2 As Double = 0
    Dim fQ3 As Double = 0
    If iSize Mod 2 = 0 Then
        fQ2 = (afVal(iMid - 1) + afVal(iMid)) / 2
        Dim iMidMid As Integer = iMid / 2
        If iMid Mod 2 = 0 Then
            fQ1 = (afVal(iMidMid - 1) + afVal(iMidMid)) / 2
            fQ3 = (afVal(iMid + iMidMid - 1) + afVal(iMid + iMidMid)) / 2
        Else
            fQ1 = afVal(iMidMid)
            fQ3 = afVal(iMidMid + iMid)
        End If
    ElseIf iSize = 1 Then
        fQ1 = afVal(0)
        fQ2 = afVal(0)
        fQ3 = afVal(0)
    Else
        fQ2 = afVal(iMid)
        If (iSize - 1) Mod 4 = 0 Then
            Dim n As Integer = (iSize - 1) / 4
            fQ1 = (afVal(n - 1) * 0.25) + (afVal(n) * 0.75)
            fQ3 = (afVal(3 * n) * 0.75) + (afVal(3 * n + 1) * 0.25)
        ElseIf (iSize - 3) Mod 4 = 0 Then
            Dim n As Integer = (iSize - 3) / 4
            fQ1 = (afVal(n) * 0.75) + (afVal(n + 1) * 0.25)
            fQ3 = (afVal(3 * n + 1) * 0.25) + (afVal(3 * n + 2) * 0.75)
        End If
    End If
    Return New Tuple(Of Double, Double, Double)(fQ1, fQ2, fQ3)
End Function
End Class

如果我正确理解,您正在尝试显示一个工具提示(在图表中悬停在一个有色的'块上时,将光标悬停在一个彩色的"块"上时(,该工具显示了有关构成重点的数据的信息。

问题在于每个"块"只是一个x和y值。例如:显示" pessoas = 392"的工具提示背后的数据点实际上只是一个简单的数据点(Series-s x = 5 y = 392(,没有其他信息。

显示一个工具提示您希望每个工具都必须预先设置,例如:

point.ToolTip = "User1 in the seriesnUser2 in the seriesn..."

相关内容

最新更新