Событие, которое срабатывает во время DataGridViewComboBoxColumn SelectedIndexChanged
У меня есть DataGridView
с двумя столбцами. Первый столбец TextBoxCol(DataGridViewTextBoxColumn)
, а второй - ComboBoxCol(DataGridViewComboBoxColumn)
.
Как изменить значение TextBoxCol
, когда ComboBoxCol
изменяет выбранное значение индекса?
(Это должно произойти, если выбранный индекс изменился в ComboBoxCol
. Не покидая столбец, например dataGridView_CellValueChanged
)
Я прочитал одну тему с почти той же проблемой, что и у меня, но я не понимаю ответа (что должно быть правильной базой на галочке). Вот ссылка. - Почти та же тема
Ответы
Ответ 1
Дайте этим двум простым методам go ( "1" в верхнем методе - это индекс столбца combobox)
Линией, в которую вы вносили бы изменения, была строка установки cel.Value =
, так как вы можете изменить ее на все, что вам нравится.
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.SelectedIndexChanged -= LastColumnComboSelectionChanged;
comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
}
}
private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
var currentcell = dataGridView1.CurrentCellAddress;
var sendingCB = sender as DataGridViewComboBoxEditingControl;
DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0];
cel.Value = sendingCB.EditingControlFormattedValue.ToString();
}
![enter image description here]()
Ответ 2
Этот ответ плавает в нескольких местах. Использование DataGridViewEditingControlShowingEventHandler будет запускать больше событий, чем вы планируете. В моем тестировании он несколько раз запускал это событие. Кроме того, использование combo.SelectedIndexChanged - = event не будет действительно удалять событие, они просто сохраняют стекирование. Во всяком случае, я нашел решение, которое, похоже, работает. Я включаю пример кода ниже:
// 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 (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();
}
}
Ответ 3
Эта ссылка верна. Обрабатывайте EditingControlShowing event
DataGridView. В этом обработчике событий проверьте, интересует ли текущий столбец. И затем создайте временный объект combobox: -
ComboBox comboBox = e.Control as ComboBox;
MSDN имеет пример: см. здесь раздел здесь.
Обратите внимание на Inheritance Hierarchy
и Class Syntax
в ссылке msdn: -
открытый класс DataGridViewComboBoxEditingControl: ComboBox, IDataGridViewEditingControl
private DataGridView dataGridView1 = new DataGridView();
private void AddColorColumn()
{
DataGridViewComboBoxColumn comboBoxColumn =
new DataGridViewComboBoxColumn();
comboBoxColumn.Items.AddRange(
Color.Red, Color.Yellow, Color.Green, Color.Blue);
comboBoxColumn.ValueType = typeof(Color);
dataGridView1.Columns.Add(comboBoxColumn);
dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(
dataGridView1_EditingControlShowing);
}
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
ComboBox combo = e.Control as ComboBox;
if (combo != null)
{
// Remove an existing event-handler, if present, to avoid
// adding multiple handlers when the editing control is reused.
combo.SelectedIndexChanged -=
new EventHandler(ComboBox_SelectedIndexChanged);
// Add the event handler.
combo.SelectedIndexChanged +=
new EventHandler(ComboBox_SelectedIndexChanged);
}
}
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
}