У меня проблема с обработкой события изменения индекса для comboBox, который находится внутри dataGridView. Я пишу метод для обработки изменения выбора ComboBox с использованием любого делегата:
ComboBox.SelectedIndexChanged -= delegate { ComboBoxIndexChanged(); };
ComboBox.SelectedIndexChanged += delegate { ComboBoxIndexChanged(); };
или EventHandler:
comboBox.SelectedIndexChanged += new EventHandler(ComboBoxIndexChanged);
но оба метода не работают должным образом. То есть, когда вы щелкаете мышью по своему выбору в comboBox (который содержится в dataGridView), требуется несколько щелчков мыши, чтобы вызвать мой ComboBoxIndexChanged (); метод, чтобы функционировать должным образом, что, если он решает функционировать вообще. Каков наилучший способ преодолеть / перейти к указанию события на indexedChange comboBox в dataGridView?
Код, который я сейчас использую в контексте, выглядит следующим образом:
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
try
{
if (this.dataGridView.CurrentCell.ColumnIndex == (int)Column.Col)
{
ComboBox comboBox = e.Control as ComboBox;
if (comboBox != null)
{
comboBox.SelectedIndexChanged += new EventHandler(ComboBoxIndexChanged);
}
}
return;
}
catch (Exception Ex)
{
Utils.ErrMsg(Ex.Message);
return;
}
}
и событие ComboBoxIndexChanged:
private void ComboBoxIndexChanged(object sender, EventArgs e)
{
// Do some amazing stuff...
}
Я прочитал аналогичную ветку о StackOverFlow, в которой говорится, что существует проблема с обработкой события изменения comboBox таким образом, но я не могу заставить работать решение. Сообщение можно найти здесь: Событие «SelectedIndexChanged» в ComboBoxColumn на Datagridview . Это говорит:
"Все усложняется, поскольку они оптимизировали DataGridView, имея только один элемент управления для редактирования всех строк. Вот как я справился с подобной ситуацией:
Сначала подключите делегата к событию EditControlShowing:
myGrid.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(
Grid_EditingControlShowing);
...
Затем в обработчике подключитесь к событию EditControl SelectedValueChanged:
void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox combo = e.Control as ComboBox;
if (combo != null)
{
// the event to handle combo changes
EventHandler comboDelegate = new EventHandler(
(cbSender, args) =>
{
DoSomeStuff();
});
// register the event with the editing control
combo.SelectedValueChanged += comboDelegate;
// since we don't want to add this event multiple times, when the
// editing control is hidden, we must remove the handler we added.
EventHandler visibilityDelegate = null;
visibilityDelegate = new EventHandler(
(visSender, args) =>
{
// remove the handlers when the editing control is
// no longer visible.
if ((visSender as Control).Visible == false)
{
combo.SelectedValueChanged -= comboDelegate;
visSender.VisibleChanged -= visibilityDelegate;
}
});
(sender as DataGridView).EditingControl.VisibleChanged +=
visibilityDelegate;
}
}"
Эта проблема, с которой я столкнулся, заключается в том, что «VisSender» не определен, поэтому событие «VisibleChanged» не может быть использовано.
Любая помощь от вас, ребята, как всегда, очень ценится.