[C#、Visual Studio 2008、Windows 7 64]
クラスにDataGridViewがあります。このデータグリッドビューはDataGridViewCheckBoxColumnを使用するため、各セルにチェックボックスが含まれます。
これは、行の1つのスクリーンショットです。
ユーザーがセルを選択したかどうかを検出できるようにしたい(セル内のどこかで、チェックボックスの上ではない)。また、ユーザーがチェックボックスを選択したことを検出したいと思います。これを行うには、コードで両方のイベントのコールバックを設定する必要があります。
this.CellClick += cellClick; // callback when the user selects a cell
this.CellContentClick += cellContentClick; // callback when the user selects a checkbox
コールバックメソッドは次のとおりです。
private void cellContentClick(object sender, DataGridViewCellEventArgs e)
{
toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
private void cellClick(object sender, DataGridViewCellEventArgs e)
{
toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
private void toggleCellCheck(int row, int column)
{
bool isChecked = (bool)this[column, row].EditedFormattedValue;
this.Rows[row].Cells[column].Value = !isChecked;
}
(注:ご覧のとおり、 toggleCellCheckメソッドはチェックボックスの値を取得して切り替え、チェック済み->チェックなしまたはチェックなし->チェック済みです。)
ユーザーがチェックボックス以外のセル内の任意の場所をクリックすると、cellClickという1つのコールバックのみが発生します。その後、toggleCellCheckメソッドが呼び出され、チェックボックスの状態が反転します。
これは私が望む正確な振る舞いです。
私が抱えている問題は、ユーザーがチェックボックスを直接クリックすると、両方のイベントがcellClick、cellContentClickの順に発生することです。
両方のコールバックが実行されると、チェックボックスがオンになっている状態が最初のコールバックの後に切り替えられ、2番目のコールバックの後に再び切り替えられます。もちろん、最終的な結果は、チェックボックスがオンになっているステータスは変更されないということです。
両方のコールバックが発生しないようにDataGridViewクラスを構成する方法はありますか?または、これが2番目のコールバックであることを( cellContentClickメソッド内で)検出する方法はありますか、またはコールバックがチェックボックスをクリックして生成され、toggleCellCheckを呼び出さずに終了する方法はありますか?
私は次のようなことを考えていました:
private void cellContentClick(object sender, DataGridViewCellEventArgs e)
{
// if sender/sender child/etc. is of type checkbox then return because
// _cellClick_ has already been called to change the checkbox checked property
// something like the following:
//
// if (typeof(sender) == CheckBox) return;
// else toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
ありがとう!
1月