尝试创建动态 Dundas Stackedarea 图

Posted

技术标签:

【中文标题】尝试创建动态 Dundas Stackedarea 图【英文标题】:Trying to create a dynamic Dundas Stackedarea chart 【发布时间】:2015-10-19 18:30:49 【问题描述】:

下午好。我尝试进行研究,但尚未找到任何有此示例的人,我通常不会寻求帮助,我只是想通了,但是这个正在杀死我!我正在尝试动态创建堆积面积图,我已经可以创建动态面积图,但我一生都无法弄清楚如何获得堆积面积图来堆叠系列。我在excel中做了类似的东西,我可以让它很好地绘制图表,但它不是动态的。 我有这样排列的数据: How the data is laid out

这就是我希望图表的外观: How I want the chart to look

如何将数据与类别或我需要做的任何事情相关联?我有一个数组中的数据,但我似乎无法弄清楚如何让图表堆叠。任何人都可以帮忙吗?如果您需要更多信息,请询问,我知道我没有包含我的代码,主要是因为它非常丑陋且冗长,但如果有人需要,可以尝试压缩一下并简化。

我的代码在下面(也许这会有所帮助,即使它很丑)

For tmpatozgroup = 1 To 1
            Dim chart1 As New Chart()
            chart1.ID = "chrt-" & tmpatozgroup & "-" & atozser
            Dim seriesperrow As Integer

            Dim chartArea1 As New ChartArea()
            chart1.Height = 340
            chart1.Palette = ChartColorPalette.Dundas
            chart1.BackColor = System.Drawing.Color.LightGray
            chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss
            chart1.BorderLineColor = System.Drawing.Color.Gray
            chart1.BorderLineStyle = ChartDashStyle.Solid
            chart1.BorderLineWidth = 4
            ' Set the ChartArea properties
            chartArea1.Name = "Default"
            chartArea1.BackColor = System.Drawing.Color.LightGray
            chartArea1.AxisX.LabelsAutoFit = False
            chartArea1.AxisX.LabelStyle.FontAngle = -45
            chartArea1.Area3DStyle.Enable3D = True
            chart1.ChartAreas.Add(chartArea1)
            Dim series1 As New Series()

            series1.Name = tblGrouping1(tmpatozgroup, 0)
            chart1.Series.Add(series1)
            chart1.Legends.Clear()
            If Not IsNothing(tblGrouping1(tmpatozgroup, 0)) Then
                For tmpatozgroup2 = 1 To 9

                    Dim legend1 As New Legend()
                    Dim sername As String
                    Dim servalues() As Double
                    Dim serformat As String
                    Dim chrtSeriesCnt As Integer

                            sername = tblGrouping1(0, tmpatozgroup2)
                            'need to tear the current row out of the array and place in tmpseries
                            Dim tmpatozcnt As Integer
                            For tmpatozcnt = 1 To 999
                                If IsNothing(tblGrouping1(0, tmpatozcnt)) Then atozseries = tmpatozcnt : Exit For
                                tmpSeries(tmpatozcnt) = tblGrouping1(tmpatozgroup2, tmpatozcnt)
                                chrtSeriesLabels(tmpatozcnt) = tblGrouping1(0, tmpatozcnt)
                            Next
                            servalues = tmpSeries
                            serformat = chrtSeriesForm1


                    chart1.Width = 1000
                    seriesperrow = 1

                    'chart1.AlignDataPointsByAxisLabel()

                    series1.Type = SeriesChartType.StackedColumn
                    series1("StackedGroupName") = "'" & tblGrouping1(tmpatozgroup, 0) & "'"
                    If Not IsNothing(tblGrouping1(tmpatozgroup, 0)) Then

                        For Each ser As Series In chart1.Series

                            For i2 As Integer = 1 To atozseries - 1

                                ser.Points.AddXY(chrtSeriesLabels(i2), servalues(i2 - 1))
                                ser.Points(i2 - 1).BorderColor = Drawing.Color.FromArgb(Split(sercolor(i2), "|")(0), Split(sercolor(i2), "|")(1), Split(sercolor(i2), "|")(2))
                                ser.Points(i2 - 1).Color = Drawing.Color.FromArgb(Split(sercolor(i2), "|")(0), Split(sercolor(i2), "|")(1), Split(sercolor(i2), "|")(2))
                                'ser.XAxisType = AxisType.Secondary

                                Dim tooltipformat As String
                                If serformat = "Currency" Then serformat = "$#,##0.00" : tooltipformat = "$#,#.00"
                                If serformat = "###,###,##0.00" Then serformat = "#,##0.00" : tooltipformat = "#,#"
                                If serformat = "###,###,##0" Then serformat = "0" : tooltipformat = "#,#"
                                ser.Points(i2 - 1).ToolTip = ser.Points(i2 - 1).AxisLabel & " : #VALY" & tooltipformat

                            Next
                            chart1.ChartAreas(0).AxisX.Interval = 1
                            chart1.ChartAreas(0).AxisX.LabelStyle.Interval = 1
                            chart1.ChartAreas(0).AxisX.Title = "test" 'chrtXAxisName
                            chart1.ChartAreas(0).AxisY.Title = sername
                            chart1.ChartAreas(0).AxisY.LabelStyle.Format = serformat
                            chart1.Palette = ChartColorPalette.Dundas
                        Next

                    End If
                Next
                If seriesonrow = seriesperrow Or seriesonrow = 0 Then
                    tr = New TableRow
                    tr.CssClass = "charts column"
                    tr.Style("display") = "none"

                End If
                td = New TableCell
                td.HorizontalAlign = HorizontalAlign.Center
                td.ColumnSpan = 6 / seriesperrow
                td.Controls.Add(chart1)
                tr.Cells.Add(td)
                tblReport.Rows.Add(tr)
                chart1 = Nothing
            End If
        Next

提前致谢! 稍后

【问题讨论】:

这是用于 WinForms 的吗?网络表单? WPF? 抱歉,目前在aspx,VB.net,dundas.charting.webcontrol是命名空间,我猜是webforms。 我打算建议 System.Web.UI.DataVisualization.Charting 具有 StackedArea 图表类型,但听起来你已经在使用其他东西了。 另外,请在您的问题中添加适当的标签,以便您获得适当的帮助。我不碰任何上面写着“VB”的东西......:O) 你会碰巧有一个该命名空间的堆叠区域的示例吗?我对登打士并不死心,可以轻松切换。至于标记它,由于 C# 和 VB 如此接近并且有这么多转换器,我不介意在 C# 中提供示例(如果它们可用的话),大多数时候所有东西的好示例都在 C# 中,甚至 MS 也喜欢给出 C# 中的示例,所以我习惯于转换。感谢您提供的任何帮助! 【参考方案1】:

这是一个示例:

    <asp:Chart ID="Chart1" runat="server" Width="600px">
        <Series>
            <asp:Series Name="Series1" ChartType="StackedArea">
                <Points>
                    <asp:DataPoint XValue="1" YValues="10" />
                    <asp:DataPoint XValue="2" YValues="20" />
                    <asp:DataPoint XValue="3" YValues="30" />
                    <asp:DataPoint XValue="4" YValues="15" />
                </Points>
            </asp:Series>
            <asp:Series ChartArea="ChartArea1" ChartType="StackedArea" Name="Series2">
                <Points>
                    <asp:DataPoint XValue="1" YValues="20" />
                    <asp:DataPoint XValue="2" YValues="40" />
                    <asp:DataPoint XValue="3" YValues="60" />
                    <asp:DataPoint XValue="4" YValues="45" />
                </Points>
            </asp:Series>
        </Series>
        <ChartAreas>
            <asp:ChartArea Name="ChartArea1">
                <AxisY>
                    <MajorGrid LineColor="DarkGray" LineDashStyle="Dot" />
                </AxisY>
                <AxisX>
                    <MajorGrid LineColor="DarkGray" LineDashStyle="Dot" />
                </AxisX>
            </asp:ChartArea>
        </ChartAreas>
    </asp:Chart>

编辑:使用代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    
        Chart chart1 = new Chart();

        ChartArea area1 = new ChartArea("Area1");

        Series series1 = new Series();
        series1.ChartType = SeriesChartType.StackedArea;
        series1.Points.Add(new DataPoint  XValue = 1, YValues = new double[]  10  );
        series1.Points.Add(new DataPoint  XValue = 2, YValues = new double[]  20  );
        series1.Points.Add(new DataPoint  XValue = 3, YValues = new double[]  30  );
        series1.Points.Add(new DataPoint  XValue = 4, YValues = new double[]  15  );
        series1.ChartArea = "Area1";

        Series series2 = new Series();
        series2.ChartType = SeriesChartType.StackedArea;
        series2.Points.Add(new DataPoint  XValue = 1, YValues = new double[]  20  );
        series2.Points.Add(new DataPoint  XValue = 2, YValues = new double[]  40  );
        series2.Points.Add(new DataPoint  XValue = 3, YValues = new double[]  60  );
        series2.Points.Add(new DataPoint  XValue = 4, YValues = new double[]  45  );
        series2.ChartArea = "Area1";

        chart1.ChartAreas.Add(area1);
        chart1.Series.Add(series1);
        chart1.Series.Add(series2);

        Controls.Add(chart1);
    

编辑 2:添加图例:

    protected void Page_Load(object sender, EventArgs e)
    
        Chart chart1 = new Chart();

        ChartArea area1 = new ChartArea("Area1");

        Legend legend1 = new Legend("Legend1");
        legend1.Docking = Docking.Top;
        legend1.Alignment = System.Drawing.StringAlignment.Center;

        Series series1 = new Series("Bought");
        series1.ChartType = SeriesChartType.StackedArea;
        series1.Points.Add(new DataPoint  XValue = 1, YValues = new double[]  10  );
        series1.Points.Add(new DataPoint  XValue = 2, YValues = new double[]  20  );
        series1.Points.Add(new DataPoint  XValue = 3, YValues = new double[]  30  );
        series1.Points.Add(new DataPoint  XValue = 4, YValues = new double[]  15  );
        series1.ChartArea = "Area1";
        series1.Legend = "Legend1";

        Series series2 = new Series("Sold");
        series2.ChartType = SeriesChartType.StackedArea;
        series2.Points.Add(new DataPoint  XValue = 1, YValues = new double[]  20  );
        series2.Points.Add(new DataPoint  XValue = 2, YValues = new double[]  40  );
        series2.Points.Add(new DataPoint  XValue = 3, YValues = new double[]  60  );
        series2.Points.Add(new DataPoint  XValue = 4, YValues = new double[]  45  );
        series2.ChartArea = "Area1";
        series2.Legend = "Legend1";

        chart1.ChartAreas.Add(area1);
        chart1.Legends.Add(legend1);
        chart1.Series.Add(series1);
        chart1.Series.Add(series2);

        Controls.Add(chart1);
    

【讨论】:

非常感谢。你会碰巧有一个动态制作的例子吗?我在这里看到了它是如何工作的,但是如果我想在代码中动态地制作它,然后将它添加到页面中,你有任何代码吗?我已经添加了命名空间,但我还不知道如何用它制作图表。 我现在没有,但它看起来很像您在帖子中所做的。 非常感谢!!!这一直在杀死我!会试试这个,也许我只是在尝试这样做时很愚蠢,这在我的脑海中是有道理的,但当它出现时却没有。 好的,我明白你有什么。但是我有一个问题,如果让我们说 1,2,3,4 是 xaxis 标签,但实际的 series1 被称为“bought”,而 series2 被称为“sold”,那怎么能显示出来,这就是我的问题所在发生。我在我的代码中发现了一些已修复的问题,但我无法弄清楚如何让这部分工作。 好的,再次感谢,我想我明白了,我想太多了,我相信。现在弄清楚如何让它在我的代码中工作。

以上是关于尝试创建动态 Dundas Stackedarea 图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将系列添加到 Dundas TreeMap

OLAP、Dundas、C#.Net:有啥网站可以轻松快速地学习吗?

Microsoft Chart Controls/Dundas Charts 清除内容?

Dundas DB IFrame 不会加载

Dundas Charting C# 列上的条件颜色规则

在 Dundas Dashboards 中创建自定义条形图