【问题标题】:C# Charts add multiple series from datatableC# Charts 从数据表中添加多个系列
【发布时间】:2012-11-12 19:18:15
【问题描述】:

我从我的数据库中检索了几个大小不同的数据表。这两个只是一个例子。

看这里的结构!

我设法创建了 2 个不同的系列并让它们出现在图例中。

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

问题 如何将 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;

在 GREGOR 的帮助下编写代码

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是什么类型的?
  • @JanKratochvil 我无法将点添加到图表中......?

标签: c# charts


【解决方案1】:

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

How to draw Chart based on DataTable from console application?

希望你会发现它有用。

以下是重点:

//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

【讨论】:

  • 我确实看了一下,但我的数据表中包含所有内容,我只需要知道如何添加 X 和 Y 点,我的数据不是双精度数据。
  • 在您的情况下,您不需要添加额外的点,绑定将完成这项工作,只需设置适当的 XValueMember 和 YValueMember。看看我编辑的答案。
  • 它不起作用...我需要每个 doman_namn 由一个系列表示。现在他们互相涂抹...所以 alltomkorv.se 的一条线在 3,3,3 处绘制,alltomkorv.se/korvfakta 的一条线在 100,100,99 处绘制
  • 当然,您需要创建(添加)附加系列。 XValueMember 和 YValueMembers 是为特定系列设置的。
  • 这行不通。排不能是一个意甲,在最好的情况下它会是一个点。因此,将 DataTable Rows 视为一个系列。要添加其他系列,您需要填充新的 DataTable。
【解决方案2】:

我自己设法做到了,但你 Gregor Primar 把我推向了正确的方向!

重要的是您设置了 X 轴和 Y 轴的值类型。由于十进制类型不是一个选项,我使用 auto 作为类型。

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;

【讨论】:

    【解决方案3】:

    这可能有效:

                    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");
                        }
    
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多