DataGridViewのDataSourceを使用してデータの表示を行おうと
しているのですが、いまいち使い方がわからなかったのでメモ書き。
DataGridView.DataSource プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.datasource.aspxDataSourceとして指定できるオブジェクトは
・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);
}
}
}

データの編集、行の削除・追加を行うことができます。
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);
}
}
}

しばらく粘ったのですが、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; }
}
}
}

狙い通りの動作になってくれました。
しかし、データの編集は行えますが、行の追加や削除は行えないようです。
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; }
}
}
}

データの編集が行えます。
また、行の削除も行えますが、行の追加は行えません。
行の追加が行えるようにするには、
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; }
}
}
}

こんな感じで、データの追加が行えるようになります。
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; }
}
}
}

AllowNew = trueを明示しなくでもデータの追加が行えました。
- 関連記事
テーマ:プログラミング - ジャンル:コンピュータ
- 2011/06/13(月) 21:35:22|
- 備忘録
-
| トラックバック:0
-
| コメント:0
- | 編集