Подтвердить что ты не робот

Как вручную вывести DataGridViewComboBoxColumn?

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

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

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

Может кто-нибудь помочь?

4b9b3361

Ответ 1

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

   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" - это ячейка со списком, которую я добавил в gridview.

Ответ 2

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

Мой код в С#:

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;
}

Ответ 3

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

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter

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

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

Ответ 4

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

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;
    }
}

Ответ 5

Я тоже искал ответ. Я закончил тем, что написал общий подраздел, который можно было бы вызывать из любого 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 будет вести себя так, как обычно, в любом случае.

Ответ 6

Мне удалось активировать поле со списком и опустить его одним щелчком мыши, установив свойство 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", и в ячейке будет показано поле со списком.

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

  • Установить свойство ReadOnly ячейки combobox на false
  • Установить свойство EditMode DataGridView на EditOnEnter
  • Создайте событие "РедактированиеСогласования" и добавьте код для выпадающего списка.

Вот пример кода, который выпадал в поле со списком и активировал его одним нажатием -

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

Ответ 7

FYI: Вот 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;
}