Help us understand the problem. What is going on with this article?

Windows FormのDataGridViewに設置したチェックボックスをカチカチしたらがあべこべになった解決策

結論から言うと、ダブルクリックイベントも考慮する必要があった。

どんな処理をしようとしていたか

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秒くらい)でもあべこべになっていたのがこれで解決。
おわり。

unsese
美術大学グラフィックデザイン科卒、ウェブ制作会社でコーダーやってぷろぐらんまに 現在はC#メイン
http://marukajiri.unsese.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away