我有一个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个实例(DataGridView
和Panel
,每个 i 彼此对应。Panel
被声明正确,但我不知道为什么我会收到此错误。
有人可以帮忙吗?
答案 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;
}
};
}