WinForms:DataGridViewButtonColumn クリック イベントの処理方法

DataGridViewButtonColumn ボタンのクリック イベントを直接処理する方法はありません。

代わりに、次のことを行う必要があります:

  • DataGridView.CellContentClick イベントを処理します。
  • ボタン列をクリックしたかどうかを確認します。
  • バインドされたデータ項目を渡して、ボタン クリック処理ロジックを実行します。

この記事では、ボタンのクリックを処理する方法の例を段階的に示します。

ボタン列を含む DataGridView の例

ボタンをクリックしたときに、その人に挨拶したい.

DataSource を BindingList に設定

var people = new BindingList<Person>()
{
	new Person() {FullName="Octavia Harris" },
	new Person() {FullName="Thomas Noel" },
	new Person() {FullName="Sama Weir" },
	new Person() {FullName="Usamah Barclay" }
};

dgvHelloWorld.DataSource = people;
Code language: C# (cs)

ClickHandler(Person p) を追加

public void ClickHandler(Person p)
{
	MessageBox.Show($"Hi {p.FullName}");
}
Code language: C# (cs)

DataGridViewButtonColumn を DataGridView に追加

dgvHelloWorld.Columns.Add(new DataGridViewButtonColumn()
{
	Text = "Say Hi",
	Tag = (Action<Person>)ClickHandler,
	UseColumnTextForButtonValue = true,
	AutoSizeMode = DataGridViewAutoSizeColumnMode.None
});
Code language: C# (cs)

ClickHandler メソッドに DataGridViewButtonColumn.Tag =デリゲート オブジェクトを設定していることに注意してください。理由は次のステップでわかります。

CellContentClick イベントを処理する

最初に CellContentClick ハンドラを接続します。

dgvHelloWorld.CellContentClick += DgvHelloWorld_CellContentClick;
Code language: C# (cs)

ハンドラーを実装します。

private void DgvHelloWorld_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
	var grid = (DataGridView)sender;

	if(e.RowIndex < 0)
	{
		//They clicked the header column, do nothing
		return;
	}

	if(grid[e.ColumnIndex, e.RowIndex] is DataGridViewButtonCell)
	{
		var clickHandler = (Action<Person>)grid.Columns[e.ColumnIndex].Tag;
		var person = (Person)grid.Rows[e.RowIndex].DataBoundItem;

		clickHandler(person);
	}
}
Code language: C# (cs)

これは、呼び出しているメソッドがわからないことに注意してください。 Tag から Action デリゲートを取得して実行するだけです。これにより、別のボタン列を追加したい場合にコードを簡単に拡張できます。基本的には、ボタン列を追加して、その Tag プロパティを別のメソッドに設定するだけです。 CellContentClick を変更する必要はまったくありません。これはOpen-Closed Principleに準拠しています 戦略パターンの一例です .