Как получить комбинированные списки DataGridView для отображения их выпадающего списка в один клик? - PullRequest
5 голосов
/ 28 ноября 2010

После того, как я установил «EditOnEnter» в true, DataGridViewComboBoxCell по-прежнему занимает два щелчка, чтобы открыть, если я не нажму на стрелку вниз в поле со списком.

Кто-нибудь знает, какчтобы исправить это?У меня есть свой собственный класс DataGridView, который я использую, поэтому я могу легко решить эту проблему в масштабе всей системы с помощью нескольких интеллектуальных обработчиков событий, надеюсь.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 28 ноября 2010

Поскольку для свойства DataGridView EditMode уже установлено значение «EditOnEnter», вы можете просто переопределить его метод OnEditingControlShowing, чтобы убедиться, что раскрывающийся список отображается, как только поле со списком получает фокус:

public class myDataGridView : DataGridView
{

    protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
    {
        base.OnEditingControlShowing(e);

        if (e.Control is ComboBox) {
            SendKeys.Send("{F4}");
        }
    }

}

Всякий раз, когда элемент управления редактирования в вашем элементе управления DataGridView получает фокус ввода, приведенный выше код проверяет, является ли это поле со списком. Если это так, то фактически "нажимает" клавишу F4, что вызывает раскрытие раскрывающейся части (попробуйте, когда любой комбинированный блок имеет фокус!). Это немного взломать, но это работает как шарм.

3 голосов
/ 18 декабря 2012

Я использовал это решение, поскольку оно позволяет избежать отправки нажатий клавиш:

Переопределите метод OnCellClick (если вы создаете подклассы) или подпишитесь на событие CellClick (если вы изменяете DGV из другого объекта, а не какподкласс).

protected override void OnCellClick(DataGridViewCellEventArgs e)
{
    // Normally the user would need to click a combo box cell once to 
    // activate it and then again to drop the list down--this is annoying for 
    // our purposes so let the user activate the drop-down with a single click.
    if (e.ColumnIndex == this.Columns["YourDropDownColumnName"].Index
        && e.RowIndex >= 0
        && e.RowIndex <= this.Rows.Count)
    {
        this.CurrentCell = this[e.ColumnIndex, e.RowIndex];
        this.BeginEdit(false);
        ComboBox comboBox = this.EditingControl as ComboBox;
        if (comboBox != null)
        {
            comboBox.DroppedDown = true;
        }
    }

    base.OnCellContentClick(e);
}
1 голос
/ 23 февраля 2014
    protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
    {
        base.OnEditingControlShowing(e);
        DataGridViewComboBoxEditingControl dataGridViewComboBoxEditingControl = e.Control as DataGridViewComboBoxEditingControl;
        if (dataGridViewComboBoxEditingControl != null)
        {
            dataGridViewComboBoxEditingControl.GotFocus += this.DataGridViewComboBoxEditingControl_GotFocus;
            dataGridViewComboBoxEditingControl.Disposed += this.DataGridViewComboBoxEditingControl_Disposed;
        }
    }

    private void DataGridViewComboBoxEditingControl_GotFocus(object sender, EventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        if (comboBox != null)
        {
            if (!comboBox.DroppedDown)
            {
                comboBox.DroppedDown = true;
            }
        }
    }

    private void DataGridViewComboBoxEditingControl_Disposed(object sender, EventArgs e)
    {
        Control control = sender as Control;
        if (control != null)
        {
            control.GotFocus -= this.DataGridViewComboBoxEditingControl_GotFocus;
            control.Disposed -= this.DataGridViewComboBoxEditingControl_Disposed;
        }
    }
0 голосов
/ 02 февраля 2012

Чтобы избежать проблем с SendKeys, попробуйте решение из Открыть раскрывающиеся (в виде таблицы) элементы одним щелчком мыши . По сути, в перехватчике OnEditingControlShowing события Enter в поле со списком в обработчике события Enter установите ComboBox.DroppedDown = true. Кажется, это имеет тот же эффект, но без побочных эффектов, о которых упоминает Коди Грей.

0 голосов
/ 22 декабря 2010
...