2017-04-17 19 views
2

私はBindingListを含むクラスのいくつかのインスタンスを持っています。リストは定期的に更新されます。複数のリストを複数のチャートシリーズにバインドする最も良い方法

public class myclass 
{ 
    public BindingList<double> values; 
    public string name; 
    //....code 

    public void UpdateVaues() 
    { 
     //Get somevalue 
     values.Add(somevalue); 
    } 
} 

理想的には私は、DataTableのようなもので、これらのリストのいくつかを入れたいだけだろう:後で、その後

chart1.DataSource = datatable; 

そして:

chart1.DataBind(); 

、すべてが更新されています。

は現在、私はちょうど絶えず時に各リスト1を再バインドしています:

//Inside main form 
chart1.Series["one"].Points.DataBindY(myclass1.values); 
chart1.Series["two"].Points.DataBindY(myclass2.values); 
//... 

私はこれが最善の方法であると信じてすることはできません。何か案は?

+0

UpdateVaues()内で、ページローダーを呼び出して新しい値をリロードしてみてください。 – Reddy

+0

返事をありがとう。これは実際にはWebアプリケーションではなく、Winフォームアプリです。また、 'myclass'はプログラムの残りの部分にアクセスできません。 – jmurray

答えて

0

複数のバインディングを持つ1つのソースを検索する場合は、DataTablesとObservableCollectionでDataSetを使用できます。

public class myclass 
{ 
    public DataSet dataSet = new DataSet(); 
    public DataTable dt1; 
    public DataTable dt2; 

    public ObservableCollection<double> values1; 
    public ObservableCollection<double> values2; 

    public myclass() { 
     values1.CollectionChanged += values1Changed; 
    } 

    public void CreateTables() 
    { 
     // Create the DataSet 

     // Create the Data Tables 
     dt1 = new DataTable(); 
     dt2 = new DataTable(); 

     dataSet.Tables.Add(dt1); 
     dataSet.Tables.Add(dt1); 

     chart1.DataSource = dataSet; 
    } 

    private void values1Changed(object sender, NotifyCollectionChangedEventArgs args) 
    { 
     //Get somevalue (what changed) 
     dt1.Rows.Add(somevalue); 

     chart1.DataBind(); 
    } 
} 

編集:複数のBindingList

public BindingSource bindingSource { get; set; } = new BindingSource(); 
    public BindingList<BindingList<double>> bindingList { get; set; } = new BindingList<BindingList<double>>(); 
    public BindingList<double> values1 { get; set; } = new BindingList<double>(); 
    public BindingList<double> values2 { get; set; } = new BindingList<double>(); 

    public Form1() 
    { 
     InitializeComponent(); 

     bindingList.Add(values1); 
     bindingList.Add(values2); 

     bindingSource.DataSource = bindingList; 

     chart1.DataSource = bindingSource; 
    } 

免責事項とBindingSourceに基づいて別の可能な解決策:私は完全にこれをテストしていませんが、それが動作するかどうかを確認できます。また、チャート上にDataMembersを設定する必要があります。

+0

ありがとう!これは本当に役に立ち、素晴らしい作品でした。私はまだ簡単な方法ではないことに悩まされています。リストを保持できる構造(リストの値を取るだけでなく)にバインドできる構造があるはずです。例えば、私はバインディングリストとして 'DataGridView'のデータソースを設定することができます。それから私はリストに必要なオブジェクトを追加するだけです。追加されたオブジェクト(バインディングリストだけでなく)に対する変更は、 'DataGridView'に反映されます。チャートデータソースに相当するものはありませんか? – jmurray

+0

もう1つの解決策を追加しましたが、完全にテストしていません。 BindingListのBindingListをBindingSourceと共にチャート上で使用し、DataMembersを特定のチャートコンポーネントに設定することができます。 DataMemberのプロパティ名が必要な場合は、 'BindingList 'から派生したクラスを作成し、BindingListのプロパティとしてそのオブジェクトに追加し、そのオブジェクトをバインディングソースに設定することができます。私が言ったように、私は完全にそれをテストしていないが、それは動作する可能性があります。 –

関連する問題