Как вручную вывести DataGridViewComboBoxColumn?
У меня есть DataGridView с одним DataGridViewComboBoxColumn в моем приложении WinForms. Мне нужно вручную открыть этот DataGridViewComboBoxColumn, скажем, после нажатия кнопки.
Причина, по которой мне это нужно, я установил SelectionMode в FullRowSelect, и мне нужно нажать 2-3 раза, чтобы открыть поле со списком. Я хочу щелкнуть по ячейке со списком, и он должен немедленно упасть. Я хочу сделать это с событием CellClick, или есть ли другой способ?
Я ищу в Google и VS помощь, но я еще не нашел никакой информации.
Может кто-нибудь помочь?
Ответы
Ответ 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;
}