今回は、DataGridViewのデータソースにBindingSource(IBindingListViewの実装)を指定してみます。
BindingSourceは、.NET 2.0で追加されたソースでその名の通りデータをバインディングするのが
仕事です。具体的には、特定のコントロールと特定のデータの間に存在して両者を繋ぎます。
そのほかにも、厳密な型指定ができたりするなど、これもDataGridViewと同じく機能豊富です。
(そして、ややこしいです・・・・)
よくあるパターンが
DataGridView <=> BindingSource <=> データベースのデータソース
みたいな感じでしょうか。
Javaやってる人からすると、JTableのTableModelみたいなものと考えるとわかりやすいです。
BindingSourceコンポーネントを利用すると、BindingNavigatorコンポーネントなどと連携できる
ようになります。
で、サンプルです。
とりあえず、グリッドに対してBindingSourceをデータソースとして指定し、
表示および、データの追加ができるようにします。
キーとなるのが、BindingSourceコンポーネントの
- DataSourceプロパティ
- AddNewメソッド
- AddingNewイベント
- AllowNewプロパティ
です。
// vim:set ts=4 sw=4 et ws is nowrap ft=cs: using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; using Gsf.Samples.Utility; namespace Gsf.Samples.DGV{ public class DataGridViewSample08 : BaseForm{ public DataGridViewSample08() : base("DataGridViewSample08"){ // nop; } protected override void InitializeComponents(){ //////////////////////////////////////////////////// // // DataGridView & BindingSource // DataGridView grid = new DataGridView(); grid.Dock = DockStyle.Top; grid.AutoGenerateColumns = true; grid.AllowUserToAddRows = false; BindingSource source = GetDataSource(); // // 基底となっているオブジェクトの型に既定のコンストラクタ(引数なし)が // 存在しない場合に, AddNewイベントを起こすとエラーになります。 // // その場合は、以下のようにAllowNewプロパティをtrueにします。 // source.AllowNew = true; source.AddingNew += delegate(object sender, AddingNewEventArgs args){ // // AddingNewEventArgsのNewObjectに、追加するオブジェクトをセットします。 // NewObjectには、BindingSourceに設定した基底のデータと同じ型をセットしなければなりません。 // // なお、当然ですが該当するオブジェクトのパブリックプロパティにsetが無い場合は、その項目は // 編集できません。 // args.NewObject = new D(Guid.NewGuid().ToString(), 0); }; grid.DataSource = source; //////////////////////////////////////////////////// // // BindingSourceを操作するためのボタンなど // Panel p = new Panel(); p.Dock = DockStyle.Bottom; Button b1 = new Button(); b1.Text = "追加"; b1.Click += delegate(object sender, EventArgs args){ // // AddNewメソッドを呼ぶことで以下の処理が自動的に走ります。 // // BindingSource.EndEdit() // BingingSource.AddingNewイベント // source.AddNew(); }; p.Controls.Add(b1); Controls.Add(grid); Controls.Add(p); } /// <summary> /// DataGridViewに使用するデータソースを取得します。 /// </summary> BingingSource GetDataSource(){ BindingSource source = new BindingSource(); // // typeof(D)をデータソースとすることで、このBindingSourceの // 基底データオブジェクトの型がDとなります。 // source.DataSource = typeof(D); return source; } [STAThread] static void Main(){ ApplicationUtility.Launch("Gsf.Samples.DGV.DataGridViewSample08"); } } /// <summary> /// サンプル用のデータクラスです。 /// </summary> class D{ string _name; int _age; public D(string name, int age){ _name = name; _age = age; } public string Name{ get{ return _name; } set{ _name = value; } } public int Age{ get{ return _age; } set{ _age = value; } } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場