如何判断水平滚动条是否显示在列表框中

时间:2013-07-28 21:19:53

标签: c# listbox

我正在将项目添加到c#列表框中,并希望始终将其滚动到添加到列表中的最后一项,以便它可见。该列表通常会超出可用空间,因此将显示垂直滚动条,并且当​​用户可以移动它时,我需要强制它再次使用新项目跳到最后。我找到的唯一有用的方法是使用TopIndex属性和框中的行 - 可以显示的行数。我使用下面的代码可以正常工作,除非其中一行太长,在这种情况下,水平滚动条占用了最后两个项目的空间。如果我能弄清楚是否显示了水平条,我可以更改计算中的行数以考虑它。

        LB1.Items.Add(strText);
        LB1.TopIndex = Math.Max(0,lbXmlMsg.Items.Count - 10); // 10 rows visible

这似乎需要做很多工作才能确保新项目可见。我在这里错过了什么东西吗?

3 个答案:

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

它将确保最后一项可见。