注意
実務上で起きた話です。
プロジェクトから離れたので、具体的な特効薬コードは手元にない。
具体的なメソッドやそのときの解決策は出るので許して。
何番煎じその2。
どんな処理をしようとしていたか
DataGridViewには下記のようにデータは表示される。
| No | Data | |
|---|---|---|
| □ | 1 | AAA |
| □ | 1-1 | BBB |
| □ | 1-2 | CCC |
| □ | 1-3 | DDD |
| □ | 2 | AAA |
| □ | 2-1 | BBB |
例として、No列の1のチェックボックスをクリックすると
1-1~1-3のチェックボックスにもチェックが付き、2~2-1にはチェックが付かないようにする。
こんな感じ。
| No | Data | |
|---|---|---|
| ■ | 1 | AAA |
| ■ | 1-1 | BBB |
| ■ | 1-2 | CCC |
| ■ | 1-3 | DDD |
| □ | 2 | AAA |
| □ | 2-1 | BBB |
カチカチするとあべこべに
普通にポチッとクリックするだけなら問題なく動いたが、ダブルクリックみたいに間髪入れずにクリックするとこんな感じになる。
| No | Data | |
|---|---|---|
| ■ | 1 | AAA |
| □ | 1-1 | BBB |
| □ | 1-2 | CCC |
| □ | 1-3 | DDD |
とか
| No | Data | |
|---|---|---|
| □ | 1 | AAA |
| ■ | 1-1 | BBB |
| ■ | 1-2 | CCC |
| ■ | 1-3 | DDD |
になる。
こうなるともう無言で画面再表示。
どう修正したか
CellContentDoubleClickイベントを追加して同じ処理を行うようにした。
private void DgvCellContentClick(object sender, DataGridViewCellEventArgs e)
{
// 大本のチェックボックスが選択されたか判定する
if (dgv["1", e.RowIndex].Value.ToString() == "1")
{
// チェックボックスの状態を反映する
dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
// 関連するデータすべてのチェックボックスの状態を変更する
if ((bool)dgv[e.ColumnIndex, e.RowIndex].EditedFormattedValue)
{
// チェックが付いた場合はチェックを付ける
// 省略
}
else
{
// チェックが外れた場合はチェックを外す
// 省略
}
}
}
private void DgvCellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// 全く同じ内容なので省略
}
データの種別を判定したり何なりは省略。
カチカチッ(コンマ秒)だけではなく、カチ‥カチ(1秒くらい)でもあべこべになっていたのがこれで解決。
おわり。