C# 手动告诉我的列表框';s滚动条在哪里
我试图在运行时使用代码手动设置垂直滚动条的位置。这就是我尝试过的 .Y属性表示:“获取或设置此点的Y坐标”。为什么不编译并给我一个例外: 错误1无法修改返回值 属于 'System.Windows.Forms.Control.AutoScrolOffset' 因为它不是一个变量C# 手动告诉我的列表框';s滚动条在哪里,c#,winforms,listbox,C#,Winforms,Listbox,我试图在运行时使用代码手动设置垂直滚动条的位置。这就是我尝试过的 .Y属性表示:“获取或设置此点的Y坐标”。为什么不编译并给我一个例外: 错误1无法修改返回值 属于 'System.Windows.Forms.Control.AutoScrolOffset' 因为它不是一个变量 AutoScrolOffset的行为可能与位置类似。您不能更改位置的X或Y,但可以将位置设置为新点(…)。它是一个结构,因此您需要在属性中设置一个新的点,而不是访问结构成员 由于struct类型是不可变的,因此通过属性访
AutoScrolOffset的行为可能与位置类似。您不能更改位置的X或Y,但可以将位置设置为新点(…)。它是一个
结构
,因此您需要在属性中设置一个新的点
,而不是访问结构
成员
由于struct
类型是不可变的,因此通过属性访问它们会引入其设计中经常未知的怪癖。通过执行listBox1.autoscroloffset
调用属性的get,这将为您提供一个副本。然后在副本中设置新的Y值,而不是属性本身。因此,当您查看您认为正在编辑的struct
的值时,您会发现它没有改变
至于控制卷轴,我刚刚发现:
不是通过坐标来控制它,而是通过列表中的项目来控制它。这是值类型和引用类型之间的关键区别。AutoScrolOffset是Point类型,一种使其成为值类型的结构。当您使用属性getter时,您将获得该值的一个副本。设置Y属性仅设置副本上的属性。C#编译器可以识别这个特殊的使用问题。但不是这个:
private void button2_Click(object sender, EventArgs e)
{
listBox1.AutoScrollOffset.Y = 10;
}
listBox1.AutoScrollOffset = new Point(listBox1.AutoScrollOffset.X, 10);
若要在必须为特性指定Point类型的值时使其正常工作,请执行以下操作:
private void button2_Click(object sender, EventArgs e)
{
var offset = listBox1.AutoScrollOffset;
offset.Y = 10; // Compiles, but doesn't work
}
这实际上不适用于滚动列表框,它只会在控件嵌入可滚动容器(如Panel)时影响控件的位置。检查ScrollControlInView以获取参考
改为指定TopIndex属性。这不会滚动垂直滚动条,而应该根据我正在阅读的代码滚动。有什么想法吗?这里有一篇MSDN帖子讨论了这个问题:
private void button2_Click(object sender, EventArgs e)
{
listBox1.AutoScrollOffset = new Point(listBox1.AutoScrollOffset.X, 10);
}