手动设置我的ListBox滚动条的位置

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

我试图在运行时使用代码手动设置垂直滚动条的位置。这是我尝试过的方法。
.Y属性表示:“获取或设置此点的Y坐标”。为什么这不会编译并给我一个异常:
“错误1:无法修改‘System.Windows.Forms.Control.AutoScrollOffset’的返回值,因为它不是一个变量。”
4个回答

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属性。


2
也许,AutoScrollOffset的行为就像Location一样。您无法更改Location的X或Y,但可以将Location设置为新的Point(...)。

2
这是一个结构体,因此您需要将一个新的“Point”设置到属性中,而不是访问结构体成员。
因为结构体类型是不可变的,通过属性访问它们会引入其设计中常见但不为人知的怪异之处。您可以通过执行“listBox1.AutoScrollOffset”来调用属性的get方法,这会给您一个副本。然后您将新的Y值设置到副本中,而不是设置到属性本身中。因此,当您去查看您认为正在编辑的结构体的值时,您会发现它没有改变。
至于控制滚动,我刚刚找到了这个:

http://moiashvin-tech.blogspot.com/2008/04/scroll-listbox-programmatically.html

不是通过坐标控制它,而是通过列表中的项目控制它。

1
listBox1.AutoScrollOffset = new Point(listBox1.AutoScrollOffset.X, 10);

这不会滚动垂直滚动条,但根据我正在阅读的代码应该会。有什么想法吗? - delete
这里有一篇MSDN文章讨论了这个问题: http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6c847d06-49b8-4dad-9b05-1b0f8baabd5a - decyclone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接