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

  • 質問

  • かなりの数のイベントを試してみましたが,チェックしたとき(はずしたとき)に直ちに発生するイベントをみつけることができませんでした。どれもフォーカスが移動したときのイベントでしたのでやむなく,下のようなコードをかいてしのいでいますが,

    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
    2010年8月7日 10:06

回答

  • > 使い方にまちがいがあるとはおもうのですが,わからないでいます。

    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
    2010年8月7日 21:08
    モデレータ

すべての返信

  • > DataGridViewのチェックボックスをクリックしたときに直ちに発生するイベントはないのでしょうか。お教え願います。

    DOBON さんのところにそのものズバリの記事がありました。
    以下のページの 「チェックボックスにチェックが付けられた(あるいはチェックが外された)ことを知る」 を参考にしてください。

    http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html


    ひらぽん http://d.hatena.ne.jp/hilapon/
    2010年8月7日 14:19
    モデレータ
  • ひらぽんさん,ありがとうございます。

    >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
    2010年8月7日 19:10
  • > 使い方にまちがいがあるとはおもうのですが,わからないでいます。

    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
    2010年8月7日 21:08
    モデレータ
  • ひらぽんさんにお示しいただきましたコードを確認することができました。

    ただ,CellValueChangedを使うと私の書いた他のコードに影響が出て何箇所かでエラーが出てしまいます。これに対する対処法はあるのですが,かなり読みずらいことになってしまいます。それで,セルを強制的に移動する方法で我慢することとします。

    どうもありがとうございました。


    zen73
    2010年8月8日 0:30