C# 如何判断水平滚动条是否显示在列表框上
我正在将项目添加到c#列表框中,并希望始终将其滚动到添加到列表中的最后一个项目,使其可见。该列表通常会超出可用空间,因此垂直滚动条将显示,当用户可以移动该列表时,我需要使用一个新项目强制它再次跳转到末尾。我发现的唯一有用的方法是将TopIndex属性用于框中的行数—可以显示的行数。除非其中一行太长,在这种情况下,水平滚动条占用了大约最后2项的空间,否则我可以使用下面的代码。如果我能弄清楚是否显示了水平条,我就可以改变计算中的行数来解释它C# 如何判断水平滚动条是否显示在列表框上,c#,listbox,C#,Listbox,我正在将项目添加到c#列表框中,并希望始终将其滚动到添加到列表中的最后一个项目,使其可见。该列表通常会超出可用空间,因此垂直滚动条将显示,当用户可以移动该列表时,我需要使用一个新项目强制它再次跳转到末尾。我发现的唯一有用的方法是将TopIndex属性用于框中的行数—可以显示的行数。除非其中一行太长,在这种情况下,水平滚动条占用了大约最后2项的空间,否则我可以使用下面的代码。如果我能弄清楚是否显示了水平条,我就可以改变计算中的行数来解释它 LB1.Items.Add(strText
LB1.Items.Add(strText);
LB1.TopIndex = Math.Max(0,lbXmlMsg.Items.Count - 10); // 10 rows visible
为了确保新项目可见,这似乎需要做很多工作。我在这里遗漏了什么吗?您可以通过调用来检查水平滚动条是否可见
LB1.HorizontalScrollbar
根据OP的评论,上述措施不起作用
我还想说,硬编码的数字是不好的做法,你可以这样做:
然后这是一种自动滚动的方法
这些我都没试过,但应该有用
如果您切换到ListView,它有一个
EnsuRevible
函数,可以完全执行您想要的任务。添加项目后,您可以执行以下操作
listBox1.SelectedIndex = listBox1.Items.Count - 1;
它将确保最后一项可见。我不确定如何轻松检测水平滚动条是否显示,但这里有一个扩展方法,可以让您滚动到最后一项,而不会引发
SelectedIndexChanged
事件
public static void ScrollToLastItem(this ListBox lb, EventHandler eventHandler)
{
lb.SelectedIndexChanged -= eventHandler;
lb.SelectedIndex = lb.Items.Count - 1;
lb.SelectedIndex = -1;
lb.SelectedIndexChanged += eventHandler;
}
您可以这样使用它(传入SelectedIndexChanged
事件处理程序)
如果你不想滚动到最后一个项目,可以很容易地将其修改为滚动到任何项目索引。你没有遗漏任何内容,只是在需要时添加滚动条有问题,我相信我已经看到了很多关于这方面的主题,只是现在还不确定这是一个好建议。但是,我不希望它被选中,但在添加LB1.SelectedIndex=-1之后,可以解决这个问题HorizintalScrollbar属性始终为true,以便在必要时创建它,因此请参阅帮助。ListView的想法很好,但仅仅替换该类型似乎还不够。我以后再试试。帮了大忙-一小时内回复2条有用信息。多数弹劾
myListBox.ScrollToLastItem(myListBox_SelectedIndexChanged);