在 C# 或 VB.NET 中将按钮列添加到 DataGridView 的右侧

本文关键字:添加 DataGridView 按钮 VB NET | 更新日期: 2023-09-27 18:05:51

我想在用 C# 或 VB.NET 编写的 WinForms 应用程序中向 DataGridView 的两侧添加一列按钮。

每个按钮都与一行相关联,并随行移动,如下所示:

  1. 无论视野有多宽,两侧的按钮始终可见。因此,即使用户向左或向右滚动,按钮也会固定在原位并始终可见
  2. 当用户在网格中上下滚动时,按钮会与其关联的行一起滚动。

我想向 DataGridView 添加列并冻结它们(例如 dataGridView1.Columns[0].Frozen = true (,但问题是我无法冻结网格中的第一列和最后一列。

您是否可以想到另一种方法可以在网格的两侧设置一组动态按钮?

在 C# 或 VB.NET 中将按钮列添加到 DataGridView 的右侧

如果您希望第一个列并且所有列始终在datagridview中可见,请使用

DataGridView.AutoSizeColumnMode = Fill

当然,中间列的宽度会自动更改...

或者这里有一些问题的另一种解决方法:

在您的DataGridView中创建带有按钮("左按钮"(的第一列并将其冻结。

然后在主DataGridView的右侧创建另一个DataGridView(将其称为dgvRightButton (

添加一个DatGridViewButtonColumn。然后同步这两个datagridview的滚动事件

VB.NET 代码

Private Sub dgvTest1_Scroll(sender As Object, e As ScrollEventArgs) Handles dgvMain.Scroll
    If e.ScrollOrientation = ScrollOrientation.VerticalScroll Then
        Me.dgvRightButton.FirstDisplayedScrollingRowIndex = Me.dgvMain.FirstDisplayedScrollingRowIndex
    End If
End Sub

测试我用于第二个datagridview的代码(仍然是 VB.NET 代码,但注释是 C#(:

//dgvRightButton_ButtonColumn - Buttons column instance(predefined column with Designer)
//dgvMain_SomeValueColumn - predefined column from Main DataGridView
Private Sub dgvRightButton_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvLeftButton.CellClick
    //Check if column are buttons column(maybe you want add more columns later)
    If Me.dgvRightButton_ButtonColumn.Name = Me.dgvRightButton.Columns(e.ColumnIndex).Name Then
        //Getting value from Main DataGridView by rowIndex
        Dim sValue As String = Me.dgvMain.Rows(e.RowIndex).Cells(Me.dgvMain_SomeValueColumn.Name).Value
        MessageBox.Show(sValue)
    End If
End Sub

将相同数量的按钮添加到第二个DataGridView将如下所示:

Private Sub dgvRightButton_AddRows()
    For i As Int32 = 0 To Me.dgvTest1.Rows.Count - 1
        Me.dgvRightButton.Rows.Add(New String() {"Right"})
    Next
End Sub

除了法比奥的回答之外,我想给出我自己的发现,我已经实施了相同的方法。

我添加了两个名为 dgvMaindgvDelete 的 DataGridView 组件。后者紧邻前者的右侧,是按钮出现的位置。

对于dvgDelete,它位于dgvMain下方 18 像素处,高度小 34 像素。这可确保它与 dgvMain 保持一致的滚动。我给了它一个垂直滚动条,但没有水平滚动条。

dgvMain我删除了垂直滚动条。

我将两者绑定到同一个数据源(在我的例子中是数组(,但阻止dgvDelete自动生成列:

dgvDelete.AutoGenerateColumns = false;

我在dgvDelete中添加了一列包含按钮。

与法比奥类似,我添加了以下代码(C#(来处理滚动。

private void dgvDelete_Scroll(object sender, ScrollEventArgs e)
{
    if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
    {
        dgvMain.FirstDisplayedScrollingRowIndex = dgvDelete.FirstDisplayedScrollingRowIndex;                
    }
}

我添加了一列按钮来dgvMain并冻结了第一列:

dgvMain.Columns[0].Frozen = true;

所以现在我在可编辑数据的两侧固定了一列按钮。

将两个网格绑定到同一数据源的一个很好的功能是,当您在dgvMain网格中移动时,dvgDelete中相应行中的按钮会自动突出显示。

我甚至可以在dgvMain左侧为第一列按钮添加第三个网格,但前提是性能影响可以忽略不计。