C# 手动告诉我的列表框';s滚动条在哪里

C# 手动告诉我的列表框';s滚动条在哪里,c#,winforms,listbox,C#,Winforms,Listbox,我试图在运行时使用代码手动设置垂直滚动条的位置。这就是我尝试过的 .Y属性表示:“获取或设置此点的Y坐标”。为什么不编译并给我一个例外: 错误1无法修改返回值 属于 'System.Windows.Forms.Control.AutoScrolOffset' 因为它不是一个变量 AutoScrolOffset的行为可能与位置类似。您不能更改位置的X或Y,但可以将位置设置为新点(…)。它是一个结构,因此您需要在属性中设置一个新的点,而不是访问结构成员 由于struct类型是不可变的,因此通过属性访

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

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

错误1无法修改返回值 属于 'System.Windows.Forms.Control.AutoScrolOffset' 因为它不是一个变量


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);
}