none
使用 MS Chart 繪製 三條 Series ,但Series 分別來自DataSet1 內的 兩個 DataTable 資料中。 RRS feed

  • 一般討論

  • 在跟各位先進請教一個 MS Chart 的問題。

    小弟設計一個曲線繪製功能,會在設備連線後,將數據繪製成曲線圖

            private void Form1_Load(object sender, EventArgs e)
            {
                chart1.DataSource = DataSet1;
                chart1.ChartAreas.Add("框線");
            }
    
    DataTable DT資料項 = new DataTable();
    
    Series TSeries1 = new Series();
    Dictionary<string, Series> TSeries = new Dictionary<string, Series>();
    
    List<string> InDataGo = new List<string>();
    
     public void vg圖線設定(string COM, string Pn)
            {
    
    DT資料項 = new DataTable(COM + Pn);
                            DataSet1.Tables.Add(DT資料項);             //將資料項加入 資料庫 中。
    
                             TSeries1 = new Series(COM + Pn + "ch1");
    
                            TSeries1.XValueMember = "時間";
                            TSeries1.YValueMembers = "ch1";
                            TSeries.Add(COM + Pn + "ch1", TSeries1);
                            chart1.Series.Add(TSeries[COM + Pn + "ch1"]);
                            chart1.Series[chart1.Series.Count - 1].ChartType = SeriesChartType.Line;
    
    
                            TSeries1 = new Series(COM + Pn + "ch2");
    
                            TSeries1.XValueMember = "時間";
                            TSeries1.YValueMembers = "ch2";
                            TSeries.Add(COM + Pn + "ch2", TSeries1);
                            chart1.Series.Add(TSeries[COM + Pn + "ch2"]);
                            chart1.Series[chart1.Series.Count - 1].ChartType = SeriesChartType.Line;
    
    
           }


    上面程式會在裝置連線後被執行,產生 Series 相關設定,測試後是可以產生數條 Series 沒有問題。

    但是,當繪製曲線圖時候,就會產生問題! 

            int ioo = 0;
            private void timer2_Tick(object sender, EventArgs e)
            {
    
                for (int x = 0; x < DataSet1.Tables.Count; x++)      
                {                                               
                    DataRow row = DataSet1.Tables[MET通道01[x] + MET型號02[x]].NewRow();
                    row[0] = ioo;       //ID 編號
                    row[1] = listView2.Items[x].SubItems[7].Text;       //時間
                    row[2] = listView2.Items[x].SubItems[2].Text;       //CH 1
                    row[3] = listView2.Items[x].SubItems[3].Text;       //裝置時間
                    row[4] = listView2.Items[x].SubItems[5].Text;       //狀態
                    DataSet1.Tables[MET通道01[x] + MET型號02[x]].Rows.Add(row);
                    
                }
                chart1.DataBind();
                ioo++;
            }
     

    上述程式碼勢將資料填入 DataSet1 中,再透過 DataBind 更新 chart1 。

    這樣的作法產生出兩個問題,我想知道我可以如何解決

    1.  程式只會將    TSeries1.XValueMember = "時間";                        TSeries1.YValueMembers = "ch1";

    對應到 DataSet1 的 Tables[0] !

    當增加新連線時,新的兩條 Series 資料對應的是 Tables[0]  而非 Tables[1] !? 我可以如何將 Series2 、Series3 對應到 Tables[1] ,而 Series0、Series1 仍舊對應 Tables[0]

    2.  DataBind 似乎只能一次繪製一個 Series 的資料! 我新產生出來曲線圖,舊的就被覆蓋了,無法一次繪製三條線。

    感謝各位不吝指教,謝謝。

    2015年8月12日 下午 05:59

所有回覆

  • 1) 您可以利用Chart控制項的DataBindTable繫結DataSet的不同DataTable

    2) 繪製多個Series可以參考這個範例:Binding a Microsoft Chart with a Dataset

    2015年8月13日 上午 01:25
  • 1) 您可以利用Chart控制項的DataBindTable繫結DataSet的不同DataTable

    2) 繪製多個Series可以參考這個範例:Binding a Microsoft Chart with a Dataset

    感謝您的回覆,但是我測試 DataBindTable 似乎不能跟 DataSet 直接聯繫! 

    不知道是我不會用還是真的不行,要讓 DataBindTable 聯繫到 DataSet 可能要做轉換,可是我試不出來 ><"

    另外您的連結我有看了,這部分我沒有問題,製作出 副數個 Series 我跟您給的教學方式差不多,但由於他沒有連結到多個 Table 所以他的方式無法供我參考。

    目前小弟先用.Points.AddXY(Ex[i], Ey[x]) 方式來解決問題,但考量到這樣似乎將一個數據處理成了兩份,似乎沒有效率且浪費記憶體空間,畢竟 DataSet 中就有我要的資料,但是又在 chart1 中儲存了內容重複的東西。

    所以小弟在想,是否有其它辦法,能讓 chart1 的 Series 直接對照到 DataSet 中指定 Table 的 Row 來同步資料?

    2015年8月14日 上午 02:38