Обработка обработчика событий SelectedIndexChanged в DataGridViewComboBoxCell

У меня есть две связанные проблемы с моим производным классом.

Я пытаюсь добавить обработчик событий SelectedIndexChanged. Это, безусловно, вызывается:

class DataGridViewColourComboBoxCell : DataGridViewComboBoxCell
{
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

        DataGridViewColourComboBoxEditingControl ctl = 
            DataGridView.EditingControl as DataGridViewColourComboBoxEditingControl;
        // Use the default row value when Value property is null.
        if (this.Value == null)
        {
            ctl.SelectedIndex = (int)this.DefaultNewRowValue;
        }
        else
        {
            ctl.SelectedItem = Find(this.Value.ToString());
            try
            {
                ctl.SelectedIndexChanged -= new EventHandler(SelectedIndexChanged);

            }
            catch { }
            ctl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
        }
    }
}

private void SelectedIndexChanged(object sender, EventArgs e)
{
    DataGridViewColourComboBoxEditingControl ctl = (DataGridViewColourComboBoxEditingControl)sender;
    MessageBox.Show(ctl.SelectedIndex.ToString());
}

Но у меня есть две проблемы:

  1. Приложение, похоже, использует обработчик событий каждый раз, когда я выбираю другую комбинацию в сетке, потому что каждый раз, когда я получаю на одно всплывающее сообщение больше, чем раньше (1, затем 2, затем 3 и так далее). Я думал, что использование блока try/catch предотвратит это.

Я исправил пункт 1. Я добавлял обработчик событий не в том месте. Мне нужно было здесь:

public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
{
    public DataGridViewColourComboBoxEditingControl() : base()
    {
        DrawMode = DrawMode.OwnerDrawFixed;

    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        //base.OnDrawItem(e);
        //....
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        MessageBox.Show(SelectedIndex.ToString());

        base.OnSelectedIndexChanged(e);
    }
}
  1. Он не срабатывает так, как хотелось бы. Я только хочу знать, когда пользователь выбрал запись из отображаемого выпадающего списка. На данный момент указанный выше обработчик событий также срабатывает при установке фокуса на следующую ячейку.

Но пункт 2 все еще остается проблемой. Событие просто щелкает другую ячейку, вызывая срабатывание события (обратите внимание, что я настроил свою сетку на редактирование при нажатии). Но один щелчок по ячейке все равно не покажет раскрывающийся список. Я не хочу, чтобы он срабатывал в этом контексте. Это должно быть результатом выбора из выпадающего списка.

Я видел это: Как обрабатывать событие SelectedIndexChanged для ComboBox?

Но я не хочу делать что-то в сетке. Я хочу делать что-то в своих производных классах. В основном я хочу определить, когда они показывают раскрывающийся список и щелкают первый элемент. Если они нажмут на первый элемент, он должен показать форму (вроде кнопки).

Обновлять:

Я считаю, что, возможно, нашел свое решение:

public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
{
    public DataGridViewColourComboBoxEditingControl() : base()
    {
        DrawMode = DrawMode.OwnerDrawFixed;
    }

    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        //base.OnDrawItem(e);
        //....
    }

    protected override void OnDropDownClosed(EventArgs e)
    {
        if(SelectedIndex == 0) // Display the pop up
            MessageBox.Show("Display pop up colour dialog");

        base.OnDropDownClosed(e);
    }
}

Мне нужно было использовать OnDropDownClosed. Единственная проблема с этим решением заключается в том, что запись уже выбрана в ячейке. Поскольку я хочу, чтобы первый элемент в комбо действовал как кнопка, идея состоит в том, что если они его выберут, он отобразит диалог (где они выбирают другой цвет, которого еще нет в комбо), и он добавит его в комбо и выберет его. . На данный момент, если я вручную добавлю SelectedIndex = 5; в обработчик (и на самом деле я выбрал индекс 4), он сначала высвечивает ячейку для индекса 4, а затем для индекса 5. Имеет смысл?


person Andrew Truckle    schedule 12.06.2016    source источник
comment
SelectedIndexChanged будет срабатывать в следующих случаях: после того, как вы выбрали индекс изменения поля со списком в текущей ячейке. Также, когда вы начинаете редактировать другую ячейку, значение которой отличается от предыдущей ячейки (хотя в зависимости от вашей реализации она может срабатывать все время, когда вы начинаете редактировать другую ячейку).   -  person Reza Aghaei    schedule 13.06.2016
comment
@RezaAghaei Кажется, SelectionChangeCommitted был правильным. Он стреляет только из дроплиста.   -  person Andrew Truckle    schedule 13.06.2016