Событие «SelectedIndexChanged» в ComboBoxColumn в Datagridview

2

Я хочу обработать это событие "SelectedIndexChanged" в DataGridViewComboBoxColumn, и я установил его на событие "EditingControlShowing" gridview.

Проблема: Событие "SelectedIndexChanged" не запускается при первой попытке выбора элемента из comboBox, но после выбора этого элемента во второй раз событие запускается, и все работает нормально!

Вот код:

private void dgvRequest_EditingControlShowing(object sender,
     DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox combo = e.Control as ComboBox;

    if (combo != null)
    {
        if (dgvRequest.CurrentCell.ColumnIndex == col_ConfirmCmb.Index)
        {
            combo.SelectedIndexChanged -= combo_ConfirmSelectionChange;
            combo.SelectedIndexChanged += combo_ConfirmSelectionChange;

            return;
        }
    }
}


void combo_ConfirmSelectionChange(object sender, EventArgs e)
{
    if (dgvRequest.CurrentCell.ColumnIndex != col_ConfirmCmb.Index) return;

    ComboBox combo = sender as ComboBox;
    if (combo == null) return;

    MessageBox.Show(combo.SelectedText);// returns Null for the first time
}
Теги:
winforms
datagridview

1 ответ

5

Все становится сложным, поскольку они оптимизировали 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;

    }
}
  • 0
    Хороший фрагмент. Это помогло мне.
  • 0
    когда вы пишете visSender во втором лямбда-выражении, как это определяется? Как это не может быть определено во время выполнения без более искусного кодирования? Большое спасибо...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню