ComboBox
セルのDataGridView
で値が変更されたときのイベントを処理したい。
CellValueChanged
イベントがありますが、DataGridView
内のどこかをクリックするまで、そのイベントは発生しません。
単純なComboBox
SelectedValueChanged
は、新しい値が選択された直後に起動します。
セル内にあるコンボボックスにリスナーを追加するにはどうすればよいですか?
上記の答えは私をしばらくサクラソウの道に導いた。複数のイベントを発生させ、イベントを追加し続けるだけなので、機能しません。問題は、上記が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();
}
}
また、コミットされていなくても、値が変更されるたびに呼び出されるCurrentCellDirtyStateChanged
イベントを処理できます。リストで選択した値を取得するには、次のようにします。
var newValue = dataGridView.CurrentCell.EditedFormattedValue;
これは、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);
}