2

我有以下代码,原始代码是:here

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dtTest As DataTable = New DataTable
        dtTest.Columns.Add("col1", GetType(Integer))
        dtTest.Columns.Add("col2", GetType(Integer))
        dtTest.Columns.Add("col3", GetType(String))

        dtTest.Rows.Add(0, 1, "S")
        dtTest.Rows.Add(0, 1, "H")
        dtTest.Rows.Add(80, 1, "C")
        dtTest.Rows.Add(43, 2, "S")
        dtTest.Rows.Add(11, 2, "H")
        dtTest.Rows.Add(55, 2, "C")
        dtTest.Rows.Add(30, 3, "S")
        dtTest.Rows.Add(85, 3, "H")
        dtTest.Rows.Add(53, 3, "C")
        dtTest.Rows.Add(55, 4, "S")
        dtTest.Rows.Add(55, 4, "H")
        dtTest.Rows.Add(11, 4, "C")

        Dim dv As DataView = New DataView(dtTest)
        dv.Sort = "col2 asc"

        Chart1.Series.RemoveAt(0) 'this is just to remove the default Series in a 
        'VB.NET chart; you may not need this

        Chart1.DataBindCrossTable(dv, "col3", "col2", "col1", "Label=col1")

        For Each cs As Series In Chart1.Series
            cs.ChartType = SeriesChartType.StackedColumn
        Next

    End Sub
End Class

代码在下面生成图表。我想知道是否有办法在列为零时不显示值,如最左侧列所示或列顶部的总值也很好。我找到了如何在 excel 中做到这一点,但没有设法实现这个程序。

非常感谢您的帮助

结果

4

1 回答 1

2

您将需要为您的系列设置过滤,我能够通过使用Filter(CompareMethod,Double,Series)以及DataManipulator.FilterSetEmptyPointsDataManipulator.FilterMatchPoints属性获得您正在寻找的结果。

修改后的代码

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim dtTest As DataTable = New DataTable
    dtTest.Columns.Add("col1", GetType(Integer))
    dtTest.Columns.Add("col2", GetType(Integer))
    dtTest.Columns.Add("col3", GetType(String))

    dtTest.Rows.Add(0, 1, "S")
    dtTest.Rows.Add(0, 1, "H")
    dtTest.Rows.Add(80, 1, "C")
    dtTest.Rows.Add(43, 2, "S")
    dtTest.Rows.Add(11, 2, "H")
    dtTest.Rows.Add(55, 2, "C")
    dtTest.Rows.Add(30, 3, "S")
    dtTest.Rows.Add(85, 3, "H")
    dtTest.Rows.Add(53, 3, "C")
    dtTest.Rows.Add(55, 4, "S")
    dtTest.Rows.Add(55, 4, "H")
    dtTest.Rows.Add(11, 4, "C")

    Dim dv As DataView = New DataView(dtTest)
    dv.Sort = "col2 asc"

    Chart1.Series.RemoveAt(0) 'this is just to remove the default Series in a 
    'VB.NET chart; you may not need this
    Chart1.DataManipulator.FilterSetEmptyPoints = True 'Points that match filter will be marked as empty
    Chart1.DataManipulator.FilterMatchedPoints = True  'Filter points that match Filter criteria



    Chart1.DataBindCrossTable(dv, "col3", "col2", "col1", "Label=col1")

    For Each cs As Series In Chart1.Series
        Chart1.DataManipulator.Filter(DataVisualization.Charting.CompareMethod.EqualTo, 0, cs)   'Compare if equal to zero
        cs.ChartType = SeriesChartType.StackedColumn
        Dim dpcp As DataPointCustomProperties = New DataPointCustomProperties

    Next

End Sub

结果

在此处输入图像描述

于 2012-11-29T04:21:31.683 回答