データバインドとは
DataGridViewとデータを紐づけることをデータバインドという。
データバインドすることで、DataGridViewの操作に伴うデータ変更、データ変更に伴うDataGridViewの表示更新に関してのコードを実装する必要がなくなる。
つまり、DataGridViewのセルの値を変更すればデータも自動で変更される。データを変更すればDataGridViewのセル値も自動で変更されることになる。
- WinForms: データバインド
https://ysk-hacklog.com/index.php/2024/02/20/winforms-databind/
バインドするデータクラスの作成
DataGridViewにバインドするデータクラスを作成する。
今回は、ToDoアプリを想定し、ToDoを管理するItemクラスを作成した。
public class Item
{
public bool Done { get; set; }
public string Name { get; set; }
public string Detail { get; set; }
}
ビルド
ここで一度ビルドする。
作成したItemクラスをVisualStudioに認識させる。
BindingSourceの作成
「DataGridView - BindingSource - データ」の構成とし、BindingSourceを介してDataGridViewとデータ(Itemクラス)を紐づける。
- DataGridView コントロールの右上隅のスマート タグ グリフ (スマート タグ グリフ) をクリックします。
- [データ ソースの選択] オプションのドロップダウン矢印をクリックします。
- プロジェクトのデータ ソースがまだない場合は、[プロジェクト データ ソースの追加] をクリックし、ウィザードに示された手順に従います。
※上図でItemクラスが表示されない場合、ビルドを忘れている。
BidingSouceを作成することで、Itemクラスのプロパティが、DataGridViewの列に追加される。(下図参照)
双方向データバインド
BidingSouceのDataSourceにItemインスタンスを設定する。
双方向データバインド(UI → データ、データ → UI)を実現するために、リストはBindingListを使う。
※ただのListだと、片方向データバインド(UI → データ)になる。
public partial class Form1 : Form
{
private BindingList<Item> _tasks;
public Form1()
{
InitializeComponent();
_tasks = new BindingList<Item>();
Item taskItem = new Item() { Done = true, Name = "a", Detail = "aaaaaaaaaa" };
_tasks.Add(taskItem);
itemBindingSource.DataSource = _tasks;
}
}
DataGridViewで行を追加すると、自動的に_tasksが更新される。
また、コードで_tasksにItemを追加すると、自動的にDataGridViewの表示が更新される。
参考
- 方法 : デザイナーを使用してデータを Windows フォーム DataGridView コントロールにバインドする
https://msdn.microsoft.com/ja-jp/library/33w255ac(v=vs.110).aspx - [Windows Form] データバインドのやり方
http://kitunechan.hatenablog.jp/entry/2015/04/16/123314 - C# の DataGridView で カスタムデータ を 利用する 方法
https://garafu.blogspot.jp/2016/09/cs-datagridview-customdata.html - DataGridView BindingSource List オブジェクト バインド
https://gist.github.com/serian/2057222 - WindowsFormsでの単項データバインドまわり
https://tocsworld.wordpress.com/2014/04/14/windowsforms%E3%81%A7%E3%81%AE%E5%8D%98%E9%A0%85%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%BE%E3%82%8F%E3%82%8A/