我正在将项目添加到c#列表框中,并希望始终将其滚动到添加到列表中的最后一项,以便它可见。该列表通常会超出可用空间,因此将显示垂直滚动条,并且当用户可以移动它时,我需要强制它再次使用新项目跳到最后。我找到的唯一有用的方法是使用TopIndex属性和框中的行 - 可以显示的行数。我使用下面的代码可以正常工作,除非其中一行太长,在这种情况下,水平滚动条占用了最后两个项目的空间。如果我能弄清楚是否显示了水平条,我可以更改计算中的行数以考虑它。
LB1.Items.Add(strText);
LB1.TopIndex = Math.Max(0,lbXmlMsg.Items.Count - 10); // 10 rows visible
这似乎需要做很多工作才能确保新项目可见。我在这里错过了什么东西吗?
答案 0 :(得分:1)
您可以通过调用
LB1.HorizontalScrollbar
击> <击> 撞击> 根据OP的评论,上述说法不起作用。
我还会说硬编码数字是不好的做法,你可以这样做: How to scroll to bottom of ListBox?
然后有一种方法可以自动滚动http://www.csharp-examples.net/autoscroll/
我没有尝试过这些,但它们应该有用。
如果你换成一个ListView,它有一个EnsureVisible
函数,可以完成你想要的工作。
答案 1 :(得分: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
事件处理程序)。
myListBox.ScrollToLastItem(myListBox_SelectedIndexChanged);
如果您不希望它仅仅转到最终项目,可以轻松修改它以滚动到任何项目索引。
答案 2 :(得分:0)
添加项目后,您可以执行以下操作
listBox1.SelectedIndex = listBox1.Items.Count - 1;
它将确保最后一项可见。