多系列条形图.NET图表控件 [英] Multi series bar chart in .NET Chart control

查看:185
本文介绍了多系列条形图.NET图表控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想多系列线图的基础上名称,但它抛出一个错误

I'm trying multi series bar chart based on "Name" but it's throwing an error

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

The chart area contains incompatible chart types. For example, bar charts and column charts cannot exist in the same chart area.

下面是我的code:

            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>

我正在寻找一个输出一样,

I'm looking for an output like,

在哪里彩条重presents名称

Where color bars represents "Names"

推荐答案

这是绝对有可能的,你就能够产生一个图表,如下所示:

This is definitely possible and you'll be able to produce a chart that looks like this:

下面code会得到你所需要的:

The following code will get what you need:

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

这篇关于多系列条形图.NET图表控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆