Symfoware

Symfowareについての考察blog

DataGridViewのDataSourceに指定できるオブジェクトについての考察

DataGridViewのDataSourceを使用してデータの表示を行おうと
しているのですが、いまいち使い方がわからなかったのでメモ書き。



DataGridView.DataSource プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.datasource.aspx


DataSourceとして指定できるオブジェクトは

・IList インターフェイス。(1次元配列等)
・IListSource インターフェイス。(DataTable、DataSet)
・IBindingList インターフェイス。(BindingList<T>等)
・IBindingListView インターフェイス。(BindingSource等)


の4つのようです。





DataTable(IListSource)を使った例



一番シンプルな例として、DataTableをDataSourceとして使用してみました。


using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            DataTable dt = new DataTable();
            //カラム名を明示する[※1]
            dt.Columns.Add("CallTest");
            dt.Rows.Add("1列目");
            dt.Rows.Add("2列目");
            dt.Rows.Add("3列目");

            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            //列の自動追加抑止
            dataGridView1.AutoGenerateColumns = false;
            //データソースに上記で生成したMyRowのリストを設定
            dataGridView1.DataSource = dt;

            //表示用カラムの生成
            DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
            //CallTestという名前でDataTableの列にアクセスする[※1]
            textColumn.DataPropertyName = "CallTest";
            textColumn.HeaderText = "バインドテスト";
            dataGridView1.Columns.Add(textColumn);
            dataGridView1.AllowUserToAddRows = true;

            this.ClientSize = new Size(300, 150);
            this.Controls.Add(dataGridView1);
        }
    }
}





34_001.png

データの編集、行の削除・追加を行うことができます。







List(IList)を使った例



普通の1次元配列も指定可能っぽかったので、string[]で試してみました。


using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            string[] list = new string[] { "1列目", "2列目", "3列目" };

            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            dataGridView1.DataSource = list;
            dataGridView1.AllowUserToAddRows = true;

            this.ClientSize = new Size(292, 150);
            this.Controls.Add(dataGridView1);
        }
    }
}





34_002.png


しばらく粘ったのですが、Lengthしか表示されません。
どうもプロパティを検出して、その値が使用されるようです。


ということで、表示用のオブジェクトを作成し、そのリストをDataSourceとして
指定してみました。



using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Collections.Generic;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            List<MyRow> ts = new List<MyRow>();
            ts.Add(new MyRow("1列目"));
            ts.Add(new MyRow("2列目"));
            ts.Add(new MyRow("3列目"));

            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            //列の自動追加抑止
            dataGridView1.AutoGenerateColumns = false;
            //データソースに上記で生成したMyRowのリストを設定
            dataGridView1.DataSource = ts;

            //表示用カラムの生成
            DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
            //ここがミソ CallTestという名前でリスト中のオブジェクトにアクセスする
            //※1
            textColumn.DataPropertyName = "CallTest";
            textColumn.HeaderText = "バインドテスト";
            dataGridView1.Columns.Add(textColumn);
            dataGridView1.AllowUserToAddRows = true;


            this.ClientSize = new Size(292, 150);
            this.Controls.Add(dataGridView1);
        }
    }
    
    class MyRow
    {
        private string _val = null;

        public MyRow(string val)
        {
            _val = val;
        }

        //※1で指定した値とそろえる
        public string CallTest
        {
            get { return _val; }
            set { this._val = value; }
        }
    }
}





34_003.png


狙い通りの動作になってくれました。
しかし、データの編集は行えますが、行の追加や削除は行えないようです。







BindingList(IBindingList)を使った例



ListからBindingListに変更して試してみました。


using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Collections.Generic;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            //ListからBindingListに変更
            //List<MyRow> ts = new List<MyRow>();
            BindingList<MyRow> ts = new BindingList<MyRow>();
            ts.Add(new MyRow("1列目"));
            ts.Add(new MyRow("2列目"));
            ts.Add(new MyRow("3列目"));

            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            //列の自動追加抑止
            dataGridView1.AutoGenerateColumns = false;
            //データソースに上記で生成したMyRowのリストを設定
            dataGridView1.DataSource = ts;

            //表示用カラムの生成
            DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
            //ここがミソ CallTestという名前でリスト中のオブジェクトにアクセスする
            //※1
            textColumn.DataPropertyName = "CallTest";
            textColumn.HeaderText = "バインドテスト";
            dataGridView1.Columns.Add(textColumn);
            dataGridView1.AllowUserToAddRows = true;


            this.ClientSize = new Size(292, 150);
            this.Controls.Add(dataGridView1);
        }
    }
    
    class MyRow
    {
        private string _val = null;

        public MyRow(string val)
        {
            _val = val;
        }

        //※1で指定した値とそろえる
        public string CallTest
        {
            get { return _val; }
            set { this._val = value; }
        }
    }
}





34_004.png


データの編集が行えます。
また、行の削除も行えますが、行の追加は行えません。


行の追加が行えるようにするには、
BindingList.AllowNewにtrueを設定します。

サンプルは以下の通り。


using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Collections.Generic;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            BindingList<MyRow> ts = new BindingList<MyRow>();
            ts.Add(new MyRow("1列目"));
            ts.Add(new MyRow("2列目"));
            ts.Add(new MyRow("3列目"));
            //AllowNewをtrueにすることで、DataGridView上で行の追加が行えるようになる
            ts.AllowNew = true;

            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            //列の自動追加抑止
            dataGridView1.AutoGenerateColumns = false;
            //データソースに上記で生成したMyRowのリストを設定
            dataGridView1.DataSource = ts;

            //表示用カラムの生成
            DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
            //CallTestという名前でリスト中のオブジェクトにアクセスする[※1]
            textColumn.DataPropertyName = "CallTest";
            textColumn.HeaderText = "バインドテスト";
            dataGridView1.Columns.Add(textColumn);
            dataGridView1.AllowUserToAddRows = true;


            this.ClientSize = new Size(292, 150);
            this.Controls.Add(dataGridView1);
        }
    }
    
    class MyRow
    {
        private string _val = null;
        
        //列を追加する時用に、引数なしのコンストラクタが必要
        public MyRow()
        {
        }
        
        public MyRow(string val)
        {
            _val = val;
        }

        //※1で指定した値とそろえる
        public string CallTest
        {
            get { return _val; }
            set { this._val = value; }
        }
    }
}






34_005.png


こんな感じで、データの追加が行えるようになります。





BindingSource(IBindingListView)を使った例



最後に、BindingSourceを使ってみます。


using System;
using System.Windows.Forms;
using System.Collections;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Data;
using System.Collections.Generic;


namespace sample
{
    public class test
    {
        public static void Main(String[] args) {
            Application.Run(new Form1());
        }
    }
    
    class Form1 : Form
    {
        
        public Form1()
        {
            BindingSource bs = new BindingSource();
            bs.Add(new MyRow("1列目"));
            bs.Add(new MyRow("2列目"));
            bs.Add(new MyRow("3列目"));


            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;

            //列の自動追加抑止
            dataGridView1.AutoGenerateColumns = false;
            //データソースに上記で生成したMyRowのリストを設定
            dataGridView1.DataSource = bs;

            //表示用カラムの生成
            DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
            //CallTestという名前でリスト中のオブジェクトにアクセスする[※1]
            textColumn.DataPropertyName = "CallTest";
            textColumn.HeaderText = "バインドテスト";
            dataGridView1.Columns.Add(textColumn);
            dataGridView1.AllowUserToAddRows = true;


            this.ClientSize = new Size(292, 150);
            this.Controls.Add(dataGridView1);
        }
    }
    
    class MyRow
    {
        private string _val = null;
        
        //列を追加する時用に、引数なしのコンストラクタが必要
        public MyRow()
        {
        }
        
        public MyRow(string val)
        {
            _val = val;
        }

        //※1で指定した値とそろえる
        public string CallTest
        {
            get { return _val; }
            set { this._val = value; }
        }
    }
}





34_006.png


AllowNew = trueを明示しなくでもデータの追加が行えました。




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/06/13(月) 21:35:22|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<C# FlowLayoutPanelでの配置ルールメモ | ホーム | C#でBase64の文字列にした画像をImageに変換して表示する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/787-ae8e8fba
この記事にトラックバックする(FC2ブログユーザー)