我的WinForms应用程序中有一个DataGridView和一个DataGridViewComboBoxColumn。我需要手动下拉(打开)这个DataGridViewComboBoxColumn,比如单击一个按钮后。
我需要这个的原因是我已将SelectionMode设置为FullRowSelect,我需要单击2-3次才能打开组合框。我想点击组合框,它应该立即下拉。我想用CellClick事件做这个,还是有其他方法吗?
我在Google和VS帮助中搜索,但我还没有找到任何信息。
有人可以帮忙吗?
答案 0 :(得分:23)
我知道这不是理想的解决方案,但它确实创建了一个在单元格内工作的单击组合框。
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中添加的组合框。
答案 1 :(得分:16)
感谢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;
}
答案 2 :(得分:11)
通过设置
,我已经能够接近你想要的东西了DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter
只要没有显示其他单元格的下拉列表,它就会立即显示所选单元格的下拉列表。
如果出现任何问题,我会继续思考和更新。
答案 3 :(得分:2)
感谢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;
}
}
答案 4 :(得分:2)
我也在寻找答案。我最后编写了一个可以从任何DataGridView调用的泛型子,因为我的应用程序中有很多,我希望它们的行为方式相同。这对我很有用,所以我想与偶然发现这篇文章的其他人分享。
在DGV的MouseClick事件中,我添加了代码
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代码,用于一些我想不到的可能引发异常的罕见实例。我不希望用户因此方案的错误消息而烦恼。如果sub失败了,那么很可能DGV的行为就像通常那样。