いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DataGridView入門記-08 (データバインド (BindingSource))(表示)

今回は、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;
            }
        }
    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。