private void button2_Click(object sender, EventArgs e)
{
listBox1.AutoScrollOffset.Y = 10;
}
我正在尝试在运行时使用代码手动设置垂直滚动条的位置。这就是我尝试过的。
.Y属性说:“获取或设置此点的Y坐标”。为什么不编译并给我一个例外:
错误1无法修改返回值 的 'System.Windows.Forms.Control.AutoScrollOffset' 因为它不是变量
答案 0 :(得分:2)
可能AutoScrollOffset就像Location一样表现自己。您无法更改位置的X或Y,但您可以将位置设置为新点(...)。
答案 1 :(得分:2)
这是struct
,因此您需要在属性中设置新的Point
,而不是访问struct
成员。
因为struct
类型是不可变的,所以通过属性访问它们会引入一种常见的设计怪癖。你可以通过listBox1.AutoScrollOffset
来调用属性的获取,这会给你一个副本。然后,您将副本设置为Y的新值,而不是属性本身。因此,当您查看您认为正在编辑的struct
的值时,您会发现它没有更改。
至于控制滚动,我刚发现:
http://moiashvin-tech.blogspot.com/2008/04/scroll-listbox-programmatically.html
不通过坐标控制它,而是通过列表中的项目控制它。
答案 2 :(得分:2)
这是值类型和引用类型之间的关键区别。 AutoScrollOffset是Point类型,它是一个使其成为值类型的结构。当您使用属性getter时,您将获得该值的副本。设置Y属性仅设置副本上的属性。 C#编译器可以识别这个特定的使用问题。但不是这个:
private void button2_Click(object sender, EventArgs e)
{
var offset = listBox1.AutoScrollOffset;
offset.Y = 10; // Compiles, but doesn't work
}
如果必须为属性指定Point类型的值
,则使其工作private void button2_Click(object sender, EventArgs e)
{
listBox1.AutoScrollOffset = new Point(listBox1.AutoScrollOffset.X, 10);
}
滚动列表框实际上并不起作用,它只会影响控件嵌入可滚动容器(如Panel)时的位置。检查ScrollControlIntoView以供参考。
改为分配TopIndex属性。
答案 3 :(得分:1)
listBox1.AutoScrollOffset = new Point(listBox1.AutoScrollOffset.X, 10);