1

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

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

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

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

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

4

2 回答 2

1

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

DataGridView.AutoSizeColumnMode = Fill

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

或者在这里您的问题的另一种解决方法:

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

然后在您的 Main 右侧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
于 2013-03-26T10:07:44.167 回答
0

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

dgvMain我添加了两个名为和的DataGridView 组件dgvDelete。后者位于前者的右侧,是按钮出现的位置。

因为dvgDelete它位于下方 18 个像素,dgvMain并且它的高度小了 34 个像素。这确保它与dgvMain. 我给了它一个垂直滚动条,但没有给它一个水平滚动条。

dgvMain我删除了垂直滚动条。

我将两者绑定到同一个数据源(在我的情况下是一个数组),但阻止dgvDelete了自动生成列:

dgvDelete.AutoGenerateColumns = false;

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

与 Fabio 类似,我添加了以下代码 (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我什至可以在第一列按钮的左侧立即添加第三个网格,但前提是性能影响可以忽略不计。

于 2013-03-27T17:26:28.803 回答