如何手动下拉DataGridViewComboBoxColumn?

时间:2008-10-27 19:16:40

标签: .net datagridview

我的WinForms应用程序中有一个DataGridView和一个DataGridViewComboBoxColumn。我需要手动下拉(打开)这个DataGridViewComboBoxColumn,比如单击一个按钮后。

我需要这个的原因是我已将SelectionMode设置为FullRowSelect,我需要单击2-3次才能打开组合框。我想点击组合框,它应该立即下拉。我想用CellClick事件做这个,还是有其他方法吗?

我在Google和VS帮助中搜索,但我还没有找到任何信息。

有人可以帮忙吗?

5 个答案:

答案 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的行为就像通常那样。