locked
how to use DataBindTable method to populate X-values to mutiple series? RRS feed

  • Question

  • User537440814 posted

    Hello friends,

    I am using DataBindTable() to bind a table to a  chart. There are several float type columns for Y values and a date type column for the X value of all other columns. But only the first series(i.e. series of index 0) got the right x values, the x values of other series seems to be set to the same random series that I don't know where it come from. I have also tried to assign each series mannually but got the same result. I have attached my two failed function and the result chart images below, could someone help me get out of this? Thanks!

    chart image(only one series is enable in each image):

    the first series(X values are set as expected)the second series(X values unexpected)

                                 image of first series                                                                     image of second series

    function 1:  use DataBindTable()

    private void RequestSensorData1()
        {
    
            string ConStr = "connectio string omitted...";
            string CmdStr = "command string omitted...";
            DataTable ds = new DataTable();
            try
            {
                myConn.Open();
                myConn = new MySqlConnection(ConStr);
                myCmd = new MySqlCommand(CmdStr, myConn);
                MySqlDataAdapter dataAdapter = new MySqlDataAdapter(myCmd);
                dataAdapter.Fill(ds);
                MyChart.DataBindTable(ds.AsDataView(), "time column");
            }
            catch
            {
    
            }
            finally
            {
                myConn.Close();
            }
        }

    function 2:  set each series mannually

    private void RequestSensorData()
        {
    
            string ConStr = "connectio string omitted...";
            string CmdStr = "command string omitted...";
            MySqlConnection myConn = new MySqlConnection(ConStr);
            try
            {
                myConn.Open();
                MySqlCommand myCmd = new MySqlCommand(CmdStr, myConn);
                MySqlDataReader myReader = myCmd.ExecuteReader();
                if (myReader.Read())
                {
                    Charts[FocusedChart].DataSource = myReader;
                    //Charts[FocusedChart].Series.Clear();
                    MyChart.Series["Series1"].XValueMember = "time Column";
                    MyChart.Series["Series1"].YValueMembers = "Y Column1";
                    MyChart.Series["Series2"].XValueMember = "time  Column";
                    MyChart.Series["Series2"].YValueMembers = "Y Column2";
                    MyChart.Series["Series3"].XValueMember = "time  Column";
                    MyChart.Series["Series3"].YValueMembers = "Y Column3";
                    //...
                    MyChart.DataBind();
                    myReader.Close();
                }
            }
            catch
            {
    
            }
            finally
            {
                myConn.Close();
            }
        }
    

    Wednesday, August 24, 2016 8:33 AM

Answers

  • User283571144 posted

    Hi Zachary.Chen,

    But only the first series(i.e. series of index 0) got the right x values, the x values of other series seems to be set to the same random series that I don't know where it come from.

    According to your description, I had written a demo on my computer.

    I find if I don't set Series.XValueType to ChartValueType.DateTime,  it will show the result as image 2 shows.

    So I suggest you change your codes and set  Series.XValueType to each series.

    More details about my test demo, you could refer to follow codes:

    Chart:

       <asp:Chart ID="Chart1" runat="server" Width="951px">
                <Series>
                    <asp:Series Name="Series1"></asp:Series>
                </Series>
                   <Series>
                    <asp:Series Name="Series2"></asp:Series>
                </Series>
                <ChartAreas>
                    <asp:ChartArea Name="ChartArea1"></asp:ChartArea>
                </ChartAreas>
                  <ChartAreas>
                    <asp:ChartArea Name="ChartArea2"></asp:ChartArea>
                </ChartAreas>
            </asp:Chart>

    Code-behind:

    protected void Page_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("weightNow", typeof(Int32));
                dt.Columns.Add("weightNow2", typeof(Int32));
                dt.Columns.Add("dateNow", typeof(DateTime));
                DateTime departure = new DateTime(2016, 5,1);
                DateTime arrival = new DateTime(2016, 6, 1);
                DateTime arrival2 = new DateTime(2016, 7, 1);
                DateTime departure1 = new DateTime(2016, 4, 1);
                DateTime arriva1l = new DateTime(2016, 3,1);
                DateTime arrival22 = new DateTime(2016, 2, 1);
                dt.Rows.Add(30,32, departure);
                dt.Rows.Add(42,36, arrival);
                dt.Rows.Add(54,38, arrival2);
                dt.Rows.Add(74,31, departure1);
                dt.Rows.Add(24,30, arriva1l);
                dt.Rows.Add(64,28, arrival22);
                //Chart1.DataBindTable(dt.AsDataView(), "dateNow");
                Chart1.Series["Series1"].ChartType = SeriesChartType.Column;
                //Chart1.Series["Series2"].ChartType = SeriesChartType.Column;
                //Chart1.Series["Series1"]["DrawingStyle"] = "Emboss";
     
                Chart1.DataSource = dt;
                Chart1.Series["Series1"].YValueMembers = "weightNow";
                Chart1.Series["Series1"].XValueMember = "dateNow";
                Chart1.Series["Series1"].XValueType = ChartValueType.DateTime;
                Chart1.Series["Series2"].YValueMembers = "weightNow2";
                Chart1.Series["Series2"].XValueMember = "dateNow";
                Chart1.Series["Series2"].XValueType = ChartValueType.DateTime;
                //Chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Format = "yyyy-MM-dd";
                Chart1.Series["Series2"].ChartArea = "ChartArea2";
                Chart1.DataBind();
    }

    Best Regards,

    Brando

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, August 25, 2016 2:30 PM

All replies

  • User283571144 posted

    Hi Zachary.Chen,

    But only the first series(i.e. series of index 0) got the right x values, the x values of other series seems to be set to the same random series that I don't know where it come from.

    According to your description, I had written a demo on my computer.

    I find if I don't set Series.XValueType to ChartValueType.DateTime,  it will show the result as image 2 shows.

    So I suggest you change your codes and set  Series.XValueType to each series.

    More details about my test demo, you could refer to follow codes:

    Chart:

       <asp:Chart ID="Chart1" runat="server" Width="951px">
                <Series>
                    <asp:Series Name="Series1"></asp:Series>
                </Series>
                   <Series>
                    <asp:Series Name="Series2"></asp:Series>
                </Series>
                <ChartAreas>
                    <asp:ChartArea Name="ChartArea1"></asp:ChartArea>
                </ChartAreas>
                  <ChartAreas>
                    <asp:ChartArea Name="ChartArea2"></asp:ChartArea>
                </ChartAreas>
            </asp:Chart>

    Code-behind:

    protected void Page_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("weightNow", typeof(Int32));
                dt.Columns.Add("weightNow2", typeof(Int32));
                dt.Columns.Add("dateNow", typeof(DateTime));
                DateTime departure = new DateTime(2016, 5,1);
                DateTime arrival = new DateTime(2016, 6, 1);
                DateTime arrival2 = new DateTime(2016, 7, 1);
                DateTime departure1 = new DateTime(2016, 4, 1);
                DateTime arriva1l = new DateTime(2016, 3,1);
                DateTime arrival22 = new DateTime(2016, 2, 1);
                dt.Rows.Add(30,32, departure);
                dt.Rows.Add(42,36, arrival);
                dt.Rows.Add(54,38, arrival2);
                dt.Rows.Add(74,31, departure1);
                dt.Rows.Add(24,30, arriva1l);
                dt.Rows.Add(64,28, arrival22);
                //Chart1.DataBindTable(dt.AsDataView(), "dateNow");
                Chart1.Series["Series1"].ChartType = SeriesChartType.Column;
                //Chart1.Series["Series2"].ChartType = SeriesChartType.Column;
                //Chart1.Series["Series1"]["DrawingStyle"] = "Emboss";
     
                Chart1.DataSource = dt;
                Chart1.Series["Series1"].YValueMembers = "weightNow";
                Chart1.Series["Series1"].XValueMember = "dateNow";
                Chart1.Series["Series1"].XValueType = ChartValueType.DateTime;
                Chart1.Series["Series2"].YValueMembers = "weightNow2";
                Chart1.Series["Series2"].XValueMember = "dateNow";
                Chart1.Series["Series2"].XValueType = ChartValueType.DateTime;
                //Chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Format = "yyyy-MM-dd";
                Chart1.Series["Series2"].ChartArea = "ChartArea2";
                Chart1.DataBind();
    }

    Best Regards,

    Brando

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Thursday, August 25, 2016 2:30 PM
  • User537440814 posted

    Hello Brando ZWZ, 

    Inspired by your demo, I set XValueType for each series, then everything is fine. Thanks!

    Chart1.Series["Series1"].XValueType = ChartValueType.DateTime;
    Monday, August 29, 2016 2:43 AM