手动告诉我的ListBox的滚动条在哪里

时间:2010-12-20 13:08:49

标签: c# winforms listbox

private void button2_Click(object sender, EventArgs e)
{
    listBox1.AutoScrollOffset.Y = 10;
}

我正在尝试在运行时使用代码手动设置垂直滚动条的位置。这就是我尝试过的。

.Y属性说:“获取或设置此点的Y坐标”。为什么不编译并给我一个例外:

  

错误1无法修改返回值   的   'System.Windows.Forms.Control.AutoScrollOffset'   因为它不是变量

4 个答案:

答案 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);