Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#或VB.NET中将按钮列添加到DataGridView的右侧_C#_Vb.net_Datagridview - Fatal编程技术网

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

在C#或VB.NET中将按钮列添加到DataGridView的右侧,c#,vb.net,datagridview,C#,Vb.net,Datagridview,我想在用C#或VB.NET编写的WinForms应用程序中,在DataGridView的两侧添加一列按钮 每个按钮都与一行关联,并随行移动,如下所示: 无论视图有多宽,两侧的按钮始终可见。因此,即使用户向左或向右滚动,按钮也会固定在原位并始终可见 当用户在网格中上下滚动时,按钮与其关联的行一起滚动 我曾考虑将列添加到DataGridView并冻结它们(例如,dataGridView1.columns[0].Frozed=true),但问题是我无法冻结网格中的第一列和最后一列 有没有另一种方法可以

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

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

  • 无论视图有多宽,两侧的按钮始终可见。因此,即使用户向左或向右滚动,按钮也会固定在原位并始终可见
  • 当用户在网格中上下滚动时,按钮与其关联的行一起滚动
  • 我曾考虑将列添加到DataGridView并冻结它们(例如,
    dataGridView1.columns[0].Frozed=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#):

    向第二个
    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
    

    如果希望第一列和所有列在
    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#):

    向第二个
    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个像素处,其高度比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
    左侧立即添加第三个网格,但前提是性能影响可以忽略不计。

    对于Fabio的回答,我想给出实施相同方法后我自己的发现

    我添加了两个名为
    dgvMain
    dgvDelete
    的DataGridView组件。后者紧靠前者的右侧,是按钮出现的地方

    对于
    dvgDelete
    而言,它位于
    dgvMain
    下方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
    左侧为第一列按钮添加第三个网格,但前提是性能影响可以忽略不计。

    谢谢Fabio。我还提出了第二个DataGridView的方法并实现了它。我将为下面的问题添加一个答案,以添加一些细节。不幸的是,由于我是StackOverflow的新手,我的声誉太低,无法推广您的答案,否则我会这么做。谢谢Fabio。我还提出了第二个DataGridView的方法并实现了它。我将为下面的问题添加一个答案,以添加一些细节。不幸的是