トップ回答者
DataGridViewのチェックボックスをクリックしたときに直ちに発生するイベントはありませんか?

質問
-
かなりの数のイベントを試してみましたが,チェックしたとき(はずしたとき)に直ちに発生するイベントをみつけることができませんでした。どれもフォーカスが移動したときのイベントでしたのでやむなく,下のようなコードをかいてしのいでいますが,
DataGridViewのチェックボックスをクリックしたときに直ちに発生するイベントはないのでしょうか。お教え願います。
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { DataGridView dgv = (DataGridView)dataGridView1; int iCol = dgv.ColumnCount; int iRow = dgv.RowCount; int cIdx = dgv.CurrentCell.ColumnIndex; int rIdx = dgv.CurrentCell.RowIndex; if (cIdx >= 17 && cIdx <= 27) { dgv.CurrentCell = dgv[cIdx + 1, rIdx]; } if (cIdx == 28) { if (rIdx == iRow - 1) { dgv.CurrentCell = dgv[17, rIdx]; } else { dgv.CurrentCell = dgv[17, rIdx + 1]; } } count_sum(); }
zen73
回答
-
> 使い方にまちがいがあるとはおもうのですが,わからないでいます。
DOBON さんのサンプルは、列インデックス が 0 と前提してますからね。以下で試してみてはいかがでしょうか?
private void DataGridView1_CurrentCellDirtyStateChanged( object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty) { //コミットする dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); } } //CellValueChangedイベントハンドラ private void DataGridView1_CellValueChanged( object sender, DataGridViewCellEventArgs e) { //チェックボックスの列かどうか調べる if (dataGridView1.Columns[e.ColumnIndex].ValueType == typeof(bool)) { MessageBox.Show( string.Format("{0}行目のチェックボックスが{1}に変わりました。", e.RowIndex, dataGridView1[e.ColumnIndex, e.RowIndex].Value)); } }
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク zen73 2010年8月8日 0:30
すべての返信
-
> DataGridViewのチェックボックスをクリックしたときに直ちに発生するイベントはないのでしょうか。お教え願います。
DOBON さんのところにそのものズバリの記事がありました。
以下のページの 「チェックボックスにチェックが付けられた(あるいはチェックが外された)ことを知る」 を参考にしてください。http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html
ひらぽん http://d.hatena.ne.jp/hilapon/ -
ひらぽんさん,ありがとうございます。
>DOBON さんのところにそのものズバリの記事がありました。
じつは,その記事は見てはいました。アとかイとかやってみたのですが期待している動きはありませんでした。使い方にまちがいがあるとはおもうのですが,わからないでいます。
private void DataGridView1_CurrentCellDirtyStateChanged( object sender, EventArgs e) { if (DataGridView1.CurrentCellAddress.X == 0 && DataGridView1.IsCurrentCellDirty) { DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); //ア //count_sum(); } //イ //count_sum(); }
zen73 -
> 使い方にまちがいがあるとはおもうのですが,わからないでいます。
DOBON さんのサンプルは、列インデックス が 0 と前提してますからね。以下で試してみてはいかがでしょうか?
private void DataGridView1_CurrentCellDirtyStateChanged( object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty) { //コミットする dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); } } //CellValueChangedイベントハンドラ private void DataGridView1_CellValueChanged( object sender, DataGridViewCellEventArgs e) { //チェックボックスの列かどうか調べる if (dataGridView1.Columns[e.ColumnIndex].ValueType == typeof(bool)) { MessageBox.Show( string.Format("{0}行目のチェックボックスが{1}に変わりました。", e.RowIndex, dataGridView1[e.ColumnIndex, e.RowIndex].Value)); } }
ひらぽん http://d.hatena.ne.jp/hilapon/- 回答としてマーク zen73 2010年8月8日 0:30