【问题标题】:Multi series bar chart in .NET Chart control.NET Chart 控件中的多系列条形图
【发布时间】:2013-03-21 17:10:26
【问题描述】:

我正在尝试基于“名称”的多系列条形图,但它会引发错误

图表区域包含不兼容的图表类型。例如,条形图和柱形图不能存在于同一图表区域中。

这是我的代码:

            Chart1.Series["Series1"].ChartType = SeriesChartType.Bar;
            Chart1.Series["Series1"]["DrawingStyle"] = "Emboss";
            Chart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = false;
            Chart1.Series["Series1"].IsValueShownAsLabel = true;

            DataTable dt = new DataTable();
            DataColumn dc;

            dc = new DataColumn();
            dc.ColumnName = "Name";
            dt.Columns.Add(dc);

            dc = new DataColumn();
            dc.ColumnName = "Question";
            dt.Columns.Add(dc);

            dc = new DataColumn();
            dc.ColumnName = "Marks";
            dt.Columns.Add(dc);

            DataRow dr;
            dr = dt.NewRow();
            dr["Name"] = "Fred";
            dr["Question"] = "2D";
            dr["Marks"] = "54";
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr["Name"] = "Bill";
            dr["Question"] = "3D";
            dr["Marks"] = "66";
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr["Name"] = "Rhona";
            dr["Question"] = "4D";
            dr["Marks"] = "32";
            dt.Rows.Add(dr);
            dr = dt.NewRow();
            dr["Name"] = "Peter";
            dr["Question"] = "5D";
            dr["Marks"] = "46";
            dt.Rows.Add(dr);

            var IEtable = (dt as System.ComponentModel.IListSource).GetList();

            Chart1.DataBindTable(IEtable, "Name");

标记是,

<asp:Chart ID="Chart1" runat="server" Width="850px" Height="500px" >

                            <Series>
                                    <asp:series Name="Series1" ChartArea="ChartArea1"></asp:series>
                            </Series>
                            <ChartAreas>
                                    <asp:ChartArea Name="ChartArea1">
                                    </asp:ChartArea>
                            </ChartAreas>
                    </asp:Chart>

我正在寻找类似的输出,

颜色条代表“名称”

【问题讨论】:

  • 你应该问一个问题,错误发生在哪一行
  • 必须在绑定时;不要使用调试器,因为它是 SharePoint 应用程序。
  • @Alison,我已经编辑了我的问题..我相信这个图表是可能的。
  • @Alison,假设我的数据是这样的,姓名 |问题 |标记 A |二维 | 10 乙 | 3D | 20℃ | 4D | 30 天 | 5D | 40 E | 6D | 50
  • @Rishi:您是否可以按如下方式对数据进行分组:问题 | A 分数 | B 分数 | .... | N 的分数?基本上,每个问题都会在一行中显示所有结果。如果是这样,那么您当然可以做您想做的事。

标签: c# asp.net .net


【解决方案1】:

这绝对是可能的,您将能够生成如下所示的图表:

以下代码将得到你所需要的:

ASPX

        <asp:Chart ID="Chart1" runat="server" Palette="SeaGreen" BackColor="LightGray" Width="654px">
            <Series>

            </Series>
            <ChartAreas>
                <asp:ChartArea Name="ChartArea1" AlignmentOrientation="Horizontal">
                </asp:ChartArea>
            </ChartAreas>
        </asp:Chart>

C#

        //Build Sample Data DataTable
        DataTable dt = new DataTable();
        DataColumn dc;

        dc = new DataColumn();
        dc.ColumnName = "Name";
        dt.Columns.Add(dc);

        dc = new DataColumn();
        dc.ColumnName = "Question";
        dt.Columns.Add(dc);

        dt.Columns.Add("Marks", typeof(int));

        string question = "2D";

        DataRow dr;
        dr = dt.NewRow();
        dr["Name"] = "Fred";
        dr["Question"] = question;
        dr["Marks"] = 54;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Bill";
        dr["Question"] = question;
        dr["Marks"] = 66;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Rhona";
        dr["Question"] = question;
        dr["Marks"] = 32;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Peter";
        dr["Question"] = question;
        dr["Marks"] = 46;
        dt.Rows.Add(dr);

        question = "4D";
        dr = dt.NewRow();
        dr["Name"] = "Fred";
        dr["Question"] = question;
        dr["Marks"] = 89;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Bill";
        dr["Question"] = question;
        dr["Marks"] = 99;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Rhona";
        dr["Question"] = question;
        dr["Marks"] = 28;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Peter";
        dr["Question"] = question;
        dr["Marks"] = 44;
        dt.Rows.Add(dr);

        question = "3D";
        dr = dt.NewRow();
        dr["Name"] = "Fred";
        dr["Question"] = question;
        dr["Marks"] = 26;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Bill";
        dr["Question"] = question;
        dr["Marks"] = 89;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Rhona";
        dr["Question"] = question;
        dr["Marks"] = 73;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr["Name"] = "Peter";
        dr["Question"] = question;
        dr["Marks"] = 14;
        dt.Rows.Add(dr);

        //Sort the datatable
        DataView dv = dt.DefaultView;
        dv.Sort = "Question ASC, Name ASC";
        dt = dv.ToTable();

        DataTable table = new DataTable();
        table.Columns.Add("Question", typeof(string));
        foreach (DataRow dr2 in dt.Rows)
        {
            //Add user Names to DataTable table
            if (!table.Columns.Contains(dr2["Name"].ToString())) {
                table.Columns.Add(dr2["Name"].ToString(), typeof(int));
            }

            //Add empty Question rows to DataTable
            if (table.AsEnumerable().Where(x => x.Field<string>("Question") == dr2["Question"].ToString()).Count() == 0)
            {
                table.Rows.Add(dr2["Question"].ToString());
            }
        }

        // Loop through all columns and questions and then calculate the mark
        for (int i = 1; i < table.Columns.Count;i++ )
        {
            for (int j = 0; j < table.Rows.Count; j++) 
            {
                string questionName = table.Rows[j][0].ToString();
                for (int k = 0; k < dt.Rows.Count; k++) 
                {
                    string userName = table.Columns[i].ColumnName;
                    table.Rows[j][i] = dt.AsEnumerable().Where(x => x.Field<string>("Name") == userName).Where(y=>y.Field<string>("Question") == questionName).Sum(r => r.Field<int>("Marks"));
                }
            }
        }

        Chart1.Series[seriesName].ChartType = SeriesChartType.Bar;

        //convert datatable to a IEnumerable form
        var IEtable = (table as System.ComponentModel.IListSource).GetList();

        Chart1.DataBindTable(IEtable, "Question");

【讨论】:

  • 如何按照您所说的进行数据分组。我的数据将是动态的,我将在运行时创建数据表。所以数据表就像我在问题中提到的那样。
  • 我可能无法很好地解释我的数据结构..让我再试一次..每个用户都会有相同的数据集..例如,问题和标记字段将是相同的每个用户。所以,我的数据应该是,用户 1 ---------- 问题 |标记 2D | 30 3D | 40 用户 2 ------- 2D | 70 3D | 90
  • @Rishi:我已经用全新的代码更新了我的答案。它与您拥有的数据一起工作以产生所需的结果。
  • 谢谢..检查你的代码..有两个错误行,1- if (table.AsEnumerable().Where(x => x.Field("Question") = = dr2["Question"].ToString()).Count() == 0) 说不包含 Count 2- table.Rows[j][i] = dt.AsEnumerable().Where(x => x.Field("Name") == userName).Where(y => y.Field("Question") == questionName).Sum(r => r.Field (“分数”));不包含 Sum 的定义
  • 您在页面中添加了哪些参考资料?
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
相关资源
最近更新 更多