20

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

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

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

有人可以帮忙吗?

4

7 回答 7

24

我知道这不是理想的解决方案,但它确实创建了一个在单元格内工作的单击组合框。

   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 中添加的组合框单元格。

于 2008-10-27T20:05:37.113 回答
17

感谢 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;
}
于 2008-10-28T10:16:27.787 回答
11

我已经能够通过设置接近你正在寻找的东西

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter

只要没有显示其他单元格的下拉列表,它就应该立即显示所选单元格的下拉列表。

如果有任何事情发生,我会继续思考和更新。

于 2008-10-27T20:28:09.363 回答
3

感谢 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;
    }
}
于 2011-07-19T18:18:00.530 回答
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 代码,这可能会引发异常。我不希望用户被这种场景的错误消息所困扰。如果潜艇发生故障,那么 DGV 很可能会像往常一样正常运行。

于 2015-01-06T07:25:56.117 回答
2

通过将 DataGridView 的EditMode属性设置为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;

从上面的代码中,位置 (1,1) 的 DataGirdCell 将转换为“DataGridViewComboBoxCell”,并且组合框将显示在单元格中。

下拉组合框可能需要多次单击鼠标。要在单击时激活组合框,需要执行以下步骤 -

  1. 将组合框单元格的 ReadOnly 属性设置为 false
  2. 将 DataGridView 的 EditMode 属性设置为 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

于 2015-08-26T10:26:54.200 回答
0

仅供参考:这是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;
}
于 2018-05-10T16:05:02.370 回答