web-dev-qa-db-ja.com

DataGridViewCellのコンボボックスで値の変化をキャッチするイベントは何ですか?

ComboBoxセルのDataGridViewで値が変更されたときのイベントを処理したい。

CellValueChangedイベントがありますが、DataGridView内のどこかをクリックするまで、そのイベントは発生しません。

単純なComboBoxSelectedValueChangedは、新しい値が選択された直後に起動します。

セル内にあるコンボボックスにリスナーを追加するにはどうすればよいですか?

24
yurib

上記の答えは私をしばらくサクラソウの道に導いた。複数のイベントを発生させ、イベントを追加し続けるだけなので、機能しません。問題は、上記がDataGridViewEditingControlShowingEventをキャッチし、変更された値をキャッチしないことです。したがって、フォーカスするたびに起動し、コンボボックスが変更されたかどうかに関係なく終了します。

「CurrentCellDirtyStateChanged」に関する最後の答えは、正しい方法です。これが、誰かがウサギの穴を降りることを避けるのに役立つことを願っています。

ここにいくつかのコードがあります。

        // Add the events to listen for
        dataGridView1.CellValueChanged +=
             new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
        dataGridView1.CurrentCellDirtyStateChanged +=
             new EventHandler(dataGridView1_CurrentCellDirtyStateChanged);

    // This event handler manually raises the CellValueChanged event 
    // by calling the CommitEdit method. 
    void dataGridView1_CurrentCellDirtyStateChanged(object sender,
        EventArgs e)
    {
        if (this.dataGridView1.IsCurrentCellDirty)
        {
            // This fires the cell value changed handler below
            dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        // My combobox column is the second one so I hard coded a 1, flavor to taste
        DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1];
        if (cb.Value != null)
        {
               // do stuff
               dataGridView1.Invalidate();
        }
     }
48
Severun

また、コミットされていなくても、値が変更されるたびに呼び出されるCurrentCellDirtyStateChangedイベントを処理できます。リストで選択した値を取得するには、次のようにします。

var newValue = dataGridView.CurrentCell.EditedFormattedValue;
13
Meta-Knight

これは、dataGridViewのcomboBoxで選択のイベントを発生させるコードです。

public Form1()
    {
        InitializeComponent();

        DataGridViewComboBoxColumn cmbcolumn = new DataGridViewComboBoxColumn();
        cmbcolumn.Name = "cmbColumn";
        cmbcolumn.HeaderText = "combobox column";
        cmbcolumn.Items.AddRange(new string[] { "aa", "ac", "aacc" });
        dataGridView1.Columns.Add(cmbcolumn);
        dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
    }

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        ComboBox combo = e.Control as ComboBox;
        if (combo != null)
        {
            combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
            combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
        }
    }

    private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox cb = (ComboBox)sender;
        string item = cb.Text;
        if (item != null)
            MessageBox.Show(item);
    }
13
Mitja Bonca