2013-03-25 94 views
1

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

每个按钮与行和移动与行的对应关系如下:两侧

  1. 按钮总是可见,无论多么广泛的观点得到。因此,即使用户向左或向右滚动,按钮仍保持固定并始终可见
  2. 随着用户在网格中上下滚动,按钮会随其相关联的行一起滚动。

我想添加列到DataGridView和冻结他们(例如dataGridView1.Columns[0].Frozen = true),但问题没有,我不能在网格冻结第一和最后一列。

有没有另一种方法可以让您想到在网格两侧都有一组动态按钮?

回答

1

如果你想首先和所有列始终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 
+0

谢谢法比奥。我也想出了第二个DataGridView的这种方法并实现它。我将在下面添加一个答案来添加一些细节。不幸的是,我是新来的StackOverflow,我的名声太低,以促进你的答案,否则我会这么做。 – Jim 2013-03-27 17:05:59

0

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

我添加了两个DataGridView组件,分别叫做dgvMaindgvDelete。后者位于前者的右侧,是按钮的出现位置。

对于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左侧的按钮中的第一列,但只有当对性能的影响可以忽略不计。

相关问题