2017年10月 / 09月≪ 12345678910111213141516171819202122232425262728293031≫11月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2010.07.23 (Fri)

DataGridViewのDataSourceに独自クラスのListを指定する場合

DataGridViewのDataSourceに独自クラスのList<>を入れる場合、
そのまま入れると、Listのデータを変更した際勝手にDataGridViewに反映されないのでめんどくさい。
そんなときはBindingSourceクラスを噛ませるといい感じ。
↓続き

【More・・・】

独自クラスEmployeeのListをデータソースに指定してみる。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private List<Employee> emplist;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
emplist = new List<Employee>();
emplist.Add(new Employee(0, "ああああ", 20));
emplist.Add(new Employee(1, "いいいい", 30));
emplist.Add(new Employee(2, "ううう", 40));
emplist.Add(new Employee(100, "ええええ", 50));
dataGridView1.DataSource = emplist;
}

public class Employee
{
int _ID;
string _Name;
int _Age;

public Employee(int id, string name, int age)
{
this.ID = id;
this.Name = name;
this.Age = age;
}

public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
}

///
/// Listにデータ追加
///

///
///
private void button1_Click(object sender, EventArgs e)
{
emplist.Add(new Employee(101, "1010101", 234));
}
}
}

こんな感じで出る。
uw000011_20100723195920.jpg

ちゃんと表示されるのだが、button1を押した場合、DataGridViewに反映されない。


BindingSourceを使う。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private List<Employee> emplist;
BindingSource bs;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
emplist = new List<Employee>();
emplist.Add(new Employee(0, "ああああ", 20));
emplist.Add(new Employee(1, "いいいい", 30));
emplist.Add(new Employee(2, "ううう", 40));
emplist.Add(new Employee(100, "ええええ", 50));
//dataGridView1.DataSource = emplist;
bs = new BindingSource(emplist, string.Empty);
dataGridView1.DataSource = bs;
}

public class Employee
{
int _ID;
string _Name;
int _Age;

public Employee(int id, string name, int age)
{
this.ID = id;
this.Name = name;
this.Age = age;
}

public int ID
{
get { return this._ID; }
set { this._ID = value; }
}
public string Name
{
get { return this._Name; }
set { this._Name = value; }
}
public int Age
{
get { return this._Age; }
set { this._Age = value; }
}
}
///
/// Listにデータ追加
///

///
///
private void button1_Click(object sender, EventArgs e)
{
emplist.Add(new Employee(101, "1010101", 234));
// 更新
bs.ResetBindings(false);
}
}
}

こっちだとbutton1を押すと項目が追加される。
uw000012_20100723195923.jpg

表示の更新する際はResetBindingsしないといけないけど、何かと便利。
Listデータが変更された場合常に表示更新したい場合は、
BindingSource.ListChangedイベント時にResetBindingsする処理を追加すればよさそう。試してないけど。

ResetBindingsの引数はスキーマが変更された場合は true。値のみが変更された場合は false。
ds.RaiseListChangedEvents = falseにすると、ListChangedイベントを発生させなくて済むので
複数データ変更時に使えそう。

以下BindingSource関連コピペメモ

ListChanged イベントは、List プロパティで表される基底のリストのメンバシップまたはメタデータが変更されたときに発生します。たとえば、項目が追加、削除、または移動されたり、DataSource プロパティや DataMember プロパティが変更されたりしたときに発生します。このイベントが発生しても、Sort プロパティと Filter プロパティの値は保持されます。

bool RaiseListChangedEvents(プロパティ):ListChanged イベントを発生させるかどうかを示す値を取得または設定します。

 |  20:24  |  C#.NET  |  トラックバック(0)  |  コメント(2)  |  Top↑

Comment

>BindingSource.ListChangedイベント時にResetBindingsする処理を追加すればよさそう。試してないけど。
これをすると無限ループになります。
DataSourceを変更したときに反映させたいときは、
INotifyPropertyChanged インターフェースを実装するとよいと思います。
通りすがり |  2010.09.04(土) 21:31 |  URL |  【コメント編集】

●Re: タイトルなし

ご指摘ありがとうございます。確認もせずだいぶ適当に書いてすみません。
ResetBindingsでListChangedイベントが発生するかどうかも確認してませんでしたが、
ヘルプ見たらResetBindingsでListChangedが発生するみたいですね。
呼ばれるのであればListChanged-=new System.ComponentModel.ListChangedEventHandler...
とか+=で対処すればいいかなーとか適当に考えてました。
それも試してないんですが。
INotifyPropertyChanged良さそうですね。まさにそのためのインターフェースって感じ!
必要になったら使ってみたいと思います。
上野メモ |  2010.09.05(日) 01:23 |  URL |  【コメント編集】

コメントを投稿する

URL
コメント
パス  編集・削除するのに必要
非公開  管理者だけにコメントを表示
 

Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。