C#图表:从数据表中添加多个系列

3

我从我的数据库中检索出多个数据表,它们的大小不同。这只是其中的2个示例之一。

看看这里的结构!
enter image description here
我设法创建了2个不同的系列,并让它们显示在图例上。

我的问题是如何将数据绑定到相应的系列。 系列名称是从列doman_namn创建的,系列数量是从“antal”列中创建的,该列保存唯一URL的数量。

问题 如何将ADDY和ADDX绑定到图表,现在它失败了。

这是我的目前的代码...

Chart1.DataSource = dt;

int amountofrows = Convert.ToInt32(dt.Rows[0]["antal"].ToString());

for (int i = 0; i < amountofrows; i++)
{
    string serieName = dt.Rows[i]["doman_namn"].ToString();

    Chart1.Series.Add(serieName);
    Chart1.Series[i].ChartType = SeriesChartType.Line;

    foreach(DataRow dr in dt.Rows)
    {
        try
        {
            if (String.Equals(serieName,dr["doman_namn"].ToString(), StringComparison.Ordinal))     
            {
            Chart1.Series[serieName].Points.AddY(Convert.ToDouble(dr["ranking_position"]));
            Chart1.Series[serieName].Points.AddY(Convert.ToDouble(dr["ranking_date"]));
            }
        }
        catch (Exception)
        {
            throw new InvalidOperationException("Failed when adding points");
        }
    }
}


Chart1.DataBind();
Chart1.Visible = true;

在格雷戈的帮助下完成的代码。

for (int i = 0; i < amountofrows; i++)
{
    string serieName = dt.Rows[i]["doman_namn"].ToString();

    Chart1.Series.Add(serieName);
    Chart1.Series[i].ChartType = SeriesChartType.Line;

    Chart1.Series[serieName].XValueMember = "ranking_date";
    Chart1.Series[serieName].YValueMembers = "ranking_position";

}
Chart1.DataBind();

你的问题是什么?请具体说明哪些方面出现了问题。另外,Chart1是什么类型? - Jan Kratochvil
@JanKratochvil 我无法将点添加到图表中..? - 8bitcat
3个回答

6

看看我的一个示例,如何使用代码将DataTable绑定到MS Chart:

如何从控制台应用程序基于DataTable绘制Chart?

希望你会发现它有用。

以下是关键点:

//setting the source from datatable....
chart.DataSource = dt;

//setting XValueMember for first serie (Name is column inside datasource)...
serie1.XValueMember = "ranking_position";

//setting YValueMembers...
serie1.YValueMembers = "ranking_date";

这是另一个绑定多个系列的链接:

http://dotnetslackers.com/articles/net/Binding-a-Microsoft-Chart-with-a-Dataset.aspx


在您的情况下,您不需要添加额外的点,绑定将完成工作,只需设置适当的XValueMember和YValueMembers。请查看我的编辑答案。 - Gregor Primar
它不工作...我需要每个doman_namn由一个系列表示。现在它们会互相覆盖...因此,所有tomkorv.se的一条线将在3,3,3处绘制,而所有tomkorv.se/korvfakta的一条线则在100,100,99处绘制。 - 8bitcat
当然,您需要创建(添加)其他系列。 XValueMember 和 YValueMembers 是为特定系列设置的。 - Gregor Primar
但是我不能从数据表中提取信息,然后将其添加到点数中,再将其添加到图表中吗? - 8bitcat
你可以通过代码手动添加点,但如果你可以在只有3行代码的情况下从DataTable绑定它,为什么还要这样做呢? - Gregor Primar
显示剩余2条评论

2

我自己成功完成了,但是你谷戈尔·普里马尔把我引导到正确的方向!

重要的是你为X轴和Y轴设置了值类型。由于十进制类型不可选,所以我使用了自动类型。

Chart1.DataSource = dt;

int amountofrows = Convert.ToInt32(dt.Rows[0]["antal"].ToString());

for (int i = 0; i < amountofrows; i++)
{
    List<string> xvals = new List<string>();
    List<decimal> yvals = new List<decimal>();
    string serieName = dt.Rows[i]["doman_namn"].ToString();
    Chart1.Series.Add(serieName);
    Chart1.Series[i].ChartType = SeriesChartType.Line;

    foreach(DataRow dr in dt.Rows)
    {
        try
        {


        if (String.Equals(serieName,dr["doman_namn"].ToString(), StringComparison.Ordinal))     
        {                    
            xvals.Add(dr["ranking_date"].ToString());
            yvals.Add(Convert.ToDecimal(dr["ranking_position"].ToString()));              
        }

        }
        catch (Exception)
        {

            throw new InvalidOperationException("Diagrammet kunde inte ritas upp");
        }
    }
    try
    {
        Chart1.Series[serieName].XValueType = ChartValueType.String;
        Chart1.Series[serieName].YValueType = ChartValueType.Auto;
        Chart1.Series[serieName].Points.DataBindXY(xvals.ToArray(), yvals.ToArray());
    }
    catch (Exception)
    {

        throw new InvalidOperationException("Kunde inte bind punkterna till Diagrammet");
    }    
}

Chart1.DataBind();
Chart1.Visible = true;

0

这个可能会起作用:

                if (dr.Rows.Count > 0)
                {
                    string[] seriesSessionArray = dr.AsEnumerable().Select(row => row.Field<string>("Username")).ToArray();
                    decimal[] pointsSessionArray = dr.AsEnumerable().Select(row => row.Field<decimal>("Percent")).ToArray();
                    chartGrowth.SuppressExceptions = true;
                    for (int i = 0; i < seriesSessionArray.Length; i++)
                    {
                        if (pointsSessionArray[i] == 0)
                        {
                            chartGrowth.ChartAreas[0].RecalculateAxesScale();
                        }
                        if (chartGrowth.Series.IndexOf(seriesSessionArray[i]) == -1)  //series does not exists
                        {
                            chartGrowth.Series.Add(seriesSessionArray[i]);
                        }
                        chartGrowth.Series[seriesSessionArray[i]].ChartType = SeriesChartType.SplineArea;
                        chartGrowth.Series[seriesSessionArray[i]].Points.AddY(pointsSessionArray[i]);
                        chartGrowth.Series[seriesSessionArray[i]].ToolTip = seriesSessionArray[i] + ":" + "#VAL{0.0}";
                        chartGrowth.Series[seriesSessionArray[i]].SetCustomProperty("LineTension", "0.45");
                    }

                }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接