Проблема обработчика событий ComboBox в dataGridView - PullRequest
4 голосов
/ 25 августа 2011

У меня проблема с обработкой события изменения индекса для 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» не может быть использовано.

Любая помощь от вас, ребята, как всегда, очень ценится.

1 Ответ

13 голосов
/ 25 августа 2011

Похоже, вы хотите, чтобы изменения были зафиксированы, как только пользователь изменит выпадающий список, без необходимости щелкать мышью по ячейке. Чтобы сделать это, вам нужно будет принудительно принять коммит, когда произойдет изменение (используя CommitEdit, на странице MSDN также есть пример). Добавьте это к вашему DataGridView:

// This event handler manually raises the CellValueChanged event
// by calling the CommitEdit method.
void dataGridView1_CurrentCellDirtyStateChanged(object sender,
    EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

Тогда вы можете просто прослушать CellValueChanged и избежать необходимости регистрировать событие ComboBoxValueChanged в базовом элементе редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...