在 C# 或 VB.NET 中将按钮列添加到 DataGridView 的右侧
本文关键字:添加 DataGridView 按钮 VB NET | 更新日期: 2023-09-27 18:05:51
我想在用 C# 或 VB.NET 编写的 WinForms 应用程序中向 DataGridView 的两侧添加一列按钮。
每个按钮都与一行相关联,并随行移动,如下所示:
- 无论视野有多宽,两侧的按钮始终可见。因此,即使用户向左或向右滚动,按钮也会固定在原位并始终可见
- 当用户在网格中上下滚动时,按钮会与其关联的行一起滚动。
我想向 DataGridView 添加列并冻结它们(例如 dataGridView1.Columns[0].Frozen = true
(,但问题是我无法冻结网格中的第一列和最后一列。
您是否可以想到另一种方法可以在网格的两侧设置一组动态按钮?
如果您希望第一个列并且所有列始终在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
除了法比奥的回答之外,我想给出我自己的发现,我已经实施了相同的方法。
我添加了两个名为 dgvMain
和 dgvDelete
的 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
左侧为第一列按钮添加第三个网格,但前提是性能影响可以忽略不计。