C#:使用1个ScrollBar滚动2个控件

时间:2017-10-16 15:59:34

标签: c# datagridview scrollbar panel

我有一个DataGridView控件和一个Panel控件彼此相邻放置,高度相同,并且它们都有一个可滚动到相同距离的垂直滚动条。 我想要实现的是,我控制DataGridView上的滚动条并每次移动Panel的滚动条相同的度数。

我找到了一些示例,其中两个控件都是DataGridView,但在我的情况下,一个是Panel。我尝试了以下方法:

//Inside a for loop
myDGV[i].Scroll += (sender, e) => {
    if(e.ScrollOrientation == ScrollOrientation.VerticalScroll)
    {
        int val = myDGV[i].FirstDisplayedScrollingRowIndex; //Error on this line
        myPanel[i].VerticalScroll.Value = val;
    }
};

但它会出错:

  

IndexOutOfRangeException未处理
索引超出了数组的范围。

我还找到了Using one scroll bar to control two DataGridView并尝试了以下内容:

//This is also inside a for loop
myDGV[i].Scroll += (sender, e) => {
    myPanel[i].VerticallScrollBar.Value = e.NewValue;
};

但它给了我同样的错误。 我有4个实例(DataGridViewPanel,每个 i 彼此对应。Panel被声明正确,但我不知道为什么我会收到此错误。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您应该在代码中收到关于"访问修改后的封闭的警告"你在代表中使用变量i。

正在发生的事情是你的委托正在使用局部变量i,它很可能在事件被引发之前改变了它的值(可能比你的数组长度多1)。此外,所有事件都将使用与i完全相同的值。

答案是在for循环中创建一个新的整数变量INSAIN,初始化为i的当前值。添加委托后,请确保不要修改此整数。所有数据网格视图都将使用自己的变量副本,该变量具有正确的值。

尝试使用以下内容作为解决方案:

for (int i = 0; i < myDGV.Length; i++)
{
    int ii = i;

    myDGV[i].Scroll += (sender, e) => {
        if(e.ScrollOrientation == ScrollOrientation.VerticalScroll)
        {
            int val = myDGV[ii].FirstDisplayedScrollingRowIndex;
            myPanel[ii].VerticalScroll.Value = val;
        }
    };
}