Сетка данных Windows Forms - PullRequest
       10

Сетка данных Windows Forms

3 голосов
/ 11 ноября 2009

Я создаю приложение Windows Forms, в котором есть стандарт DataGridView. DataGridView имеет несколько DataGridViewComboBoxColumn с. И с ними тяжело работать. Чтобы открыть один из них (например, выпадающий список), нужно щелкнуть ячейку не менее 3 (!!!) раз. Похоже, что первый щелчок заканчивает редактирование предыдущей ячейки; Второй щелчок активирует ячейку; и только третий щелчок отправляется самому списку. Кошмар пользовательского интерфейса, особенно когда вам нужно ввести много данных через эти списки.

Есть ли обходной путь?

Добавлено: Я только что попробовал это в пустом решении. Просто одна форма с одним представлением данных. Та же проблема. У моих коллег такая же проблема, поэтому я не могу быть единственной с этим. Нет ли стандартного обходного пути?

Ответы [ 5 ]

3 голосов
/ 20 ноября 2009

Я столкнулся с той же проблемой с моим DataGridView. Я решил проблему, изменив выбранную ячейку до того, как DataGridView обработает сам щелчок:

// Subscribe to DataGridView.MouseDown when convenient
this.dataGridView.MouseDown += this.HandleDataGridViewMouseDown;

private void HandleDataGridViewMouseDown(object sender, MouseEventArgs e)
{
    // See where the click is occurring
    DataGridView.HitTestInfo info = this.dataGridView.HitTest(e.X, e.Y);

    if (info.Type == DataGridViewHitTestType.Cell)
    {
        switch (info.ColumnIndex)
        {
            // Add and remove case statements as necessary depending on
            // which columns have ComboBoxes in them.

            case 1: // Column index 1
            case 2: // Column index 2
                this.dataGridView.CurrentCell =
                    this.dataGridView.Rows[info.RowIndex].Cells[info.ColumnIndex];
                break;
            default:
                break;
        }
    }
}
1 голос
/ 07 августа 2011

У меня была такая же проблема, и я нашел / придумал это решение. Это позволяет впервые сосредоточиться на комбинированных списках и текстовых полях, в то же время позволяя пользователю выбирать заголовок строки для удаления элемента.

someDGV.EditMode = DataGridViewEditMode.EditOnEnter;  
someDGV.CellClick += new DataGridViewCellEventHandler(DGV_CellClick);

private void DGV_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView dgv = ((DataGridView)sender);
        if (e.ColumnIndex < 0)
        {
            dgv.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
            dgv.Focus();
            dgv.EndEdit(); 
        }
        else
        {
            dgv.EditMode = DataGridViewEditMode.EditOnEnter;
            dgv.BeginEdit(false);
        }
    }
1 голос
/ 28 июня 2011

Вот действительно простой способ, если вы согласны с тем, как он влияет на другие элементы управления, не входящие в комбинированный список: Установите для свойства DataGridView EditMode значение EditOnEnter.

С http://social.msdn.microsoft.com/Forums/en/winforms/thread/bc454d5c-a1cb-4abb-939c-f16eb025d4cc

0 голосов
/ 04 августа 2011

На самом деле ни один из примеров не работает для меня. Отправка «F4» - плохой сценарий, поскольку SendKeys.Send (...) работает нестабильно ( MSDN ). Также вы не можете использовать окно WinForm с SendKeys в проекте WPF.

У Зака ​​Джонсона есть хороший пример, однако для правильной работы должны быть некоторые модификации:

// Subscribe to DataGridView.MouseDown when convenient
this.dataGridView.MouseDown += this.HandleDataGridViewMouseDown;

private void HandleDataGridViewMouseDown(object sender, MouseEventArgs e)
{
    // See where the click is occurring
    DataGridView.HitTestInfo info = this.dataGridView.HitTest(e.X, e.Y);

    if (info.Type == DataGridViewHitTestType.Cell)
    {
        switch (info.ColumnIndex)
        {
            // Add and remove case statements as necessary depending on
            // which columns have ComboBoxes in them.

            case 1: // Column index 1
            case 2: // Column index 2
                this.dataGridView.CurrentCell =
                    this.dataGridView.Rows[info.RowIndex].Cells[info.ColumnIndex];

                //Begin edit current cell
                this.dataGridView.BeginEdit(true);
                //Find cell control, if it is combobox then drop it down 
                DataGridViewComboBoxEditingControl comboBoxCellControl = 
                this.dataGridView.EditingControl as DataGridViewComboBoxEditingControl;
                    if (comboBoxCellControl != null)
                    {
                        comboBoxCellControl.DroppedDown = true;
                    }
                break;
            default:
                break;
        }
    }
}
0 голосов
/ 24 февраля 2010

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

Я не уверен во всех последствиях этого, но я обработал эту проблему, отправив F4, когда введен комбинированный список. Это работает, но я надеюсь, что это не взорвет что-то по линии.

Ex:

'This call opens up the ComboBox dropdown immediately instead of having to click into it three times to open the stupid thing
SendKeys.Send("{F4}")

я чувствую ваше разочарование, как вы можете видеть из комментария;)

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