Как вручную раскрыть DataGridViewComboBoxColumn? - PullRequest
20 голосов
/ 27 октября 2008

У меня есть DataGridView с одним DataGridViewComboBoxColumn в моем приложении WinForms. Мне нужно вручную раскрыть (открыть) этот DataGridViewComboBoxColumn, скажем, после нажатия кнопки.

Причина, по которой мне это нужно, в том, что я установил SelectionMode в FullRowSelect, и мне нужно нажать 2-3 раза, чтобы открыть поле со списком. Я хочу нажать на ячейку со списком, и она должна сразу же выпасть. Я хочу сделать это с событием CellClick, или есть другой способ?

Я ищу в Google и в справке VS, но пока не нашел никакой информации.

Кто-нибудь может помочь, пожалуйста?

Ответы [ 7 ]

23 голосов
/ 27 октября 2008

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

   Private Sub cell_Click(ByVal sender As System.Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        DataGridView1.BeginEdit(True)
        If DataGridView1.Rows(e.RowIndex).Cells(ddl.Name).Selected = True Then
            DirectCast(DataGridView1.EditingControl, DataGridViewComboBoxEditingControl).DroppedDown = True
        End If
    End Sub

где "ddl" - это ячейка со списком, которую я добавил в окне сетки.

16 голосов
/ 28 октября 2008

Спасибо ThisMat, ваше решение работает отлично.

Мой код в C #:

private void dataGridViewWeighings_CellClick(object sender, DataGridViewCellEventArgs e) {
    if (e.RowIndex < 0) {
        return;     // Header
    }
    if (e.ColumnIndex != 5) {
        return;     // Filter out other columns
    }

    dataGridViewWeighings.BeginEdit(true);
    ComboBox comboBox = (ComboBox)dataGridViewWeighings.EditingControl;
    comboBox.DroppedDown = true;
}
11 голосов
/ 27 октября 2008

Я смог приблизиться к тому, что вы ищете, установив

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter

Пока не отображается раскрывающийся список других ячеек, он должен немедленно отображать раскрывающийся список выбранных ячеек.

Я буду думать и обновлять, если что-нибудь появится.

2 голосов
/ 26 августа 2015

Мне удалось активировать поле со списком и раскрыть его одним щелчком мыши, установив для свойства EditMode DataGridView значение EditOnEnter и создание события EditingControlShowing и добавление кода для раскрывающегося списка в этом событии. Вот пример кода -

//to get the correct cell get value of row and column indexs of the cell
 ColIndex = 1;
 RowIndex = 1;

 DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell();
 ComboBoxCell.Items.AddRange("XYZ", "ABC", "PQR");
 ComboBoxCell.Value = "XYZ";
 datagridview1[ColIndex, RowIndex] = ComboBoxCell;

Из приведенного выше кода DataGirdCell в местоположении (1,1) будет преобразован в «DataGridViewComboBoxCell», а в ячейке будет показано поле со списком.

Возможно, для раскрывающегося списка требуется несколько щелчков мышью. Чтобы активировать поле со списком в один клик, необходимы следующие шаги -

  1. Установить для свойства ReadOnly ячейки со списком значение false
  2. Установите свойство EditMode объекта DataGridView в EditOnEnter
  3. Создание события EditingControlShowing и добавление кода для раскрывающегося списка

Вот пример кода для раскрывающегося списка со списком и его активации одним щелчком мыши -

private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
ComboBox ctrl = e.Control as ComboBox;
ctrl.Enter -= new EventHandler(ctrl_Enter);
ctrl.Enter += new EventHandler(ctrl_Enter);        
}
void ctrl_Enter(object sender, EventArgs e)
{
(sender as ComboBox).DroppedDown = true;
}

Для более подробной информации, пожалуйста, проверьте - http://newapputil.blogspot.in/2015/08/add-combo-box-in-cell-of-datagridview.html

2 голосов
/ 06 января 2015

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

В событие MouseClick для DGV я добавляю код

Private Sub SomeGrid_MouseClick(sender As Object, e As MouseEventArgs) Handles SomeGrid.MouseClick
    DGV_MouseClick(sender, e)
End Sub

, который вызывает следующую подпрограмму, которую я храню в общем модуле

Public Sub DGV_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Try
        Dim dgv As DataGridView = sender
        Dim h As DataGridView.HitTestInfo = dgv.HitTest(e.X, e.Y)
        If h.RowIndex > -1 AndAlso h.ColumnIndex > -1 AndAlso dgv.Columns(h.ColumnIndex).CellType Is GetType(DataGridViewComboBoxCell) Then
            Dim cell As DataGridViewComboBoxCell = dgv.Rows(h.RowIndex).Cells(h.ColumnIndex)
            If Not dgv.CurrentCell Is cell Then dgv.CurrentCell = cell
            If Not dgv.IsCurrentCellInEditMode Then
                dgv.BeginEdit(True)
                CType(dgv.EditingControl, ComboBox).DroppedDown = True
            End If
        End If
    Catch ex As Exception
    End Try
End Sub

Я никогда не обнаруживал никаких ошибок, я включил код Try..Catch только для некоторых редких случаев, о которых я не мог думать, что может вызвать исключение. Я не хотел, чтобы пользователя беспокоили сообщения об ошибках для этого сценария. Если сабвуфер выходит из строя, то, скорее всего, DGV будет вести себя так же, как обычно.

2 голосов
/ 19 июля 2011

Спасибо за версию C #. Вот мой вклад в поиск по именам комбинированных столбцов:

private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
{
    string Weekdays = @"MondayTuesdayWednesdayThursdayFridaySaturdaySunday";
    if (Weekdays.IndexOf(dgv.Columns[e.ColumnIndex].Name) != -1)
    {
        dgv.BeginEdit(true);
        ComboBox comboBox = (ComboBox)dgv.EditingControl;
        comboBox.DroppedDown = true;
    }
}
0 голосов
/ 10 мая 2018

К вашему сведению: Вот код nvivekgoyal из ссылки в его ответе :

private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox ctrl = e.Control as ComboBox;
    ctrl.Enter -= new EventHandler(ctrl_Enter);
    ctrl.Enter += new EventHandler(ctrl_Enter);
}

void ctrl_Enter(object sender, EventArgs e)
{
    (sender as ComboBox).DroppedDown = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...