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

本文关键字:显示 是否 列表 滚动条 水平 何判断 判断 | 更新日期: 2023-09-27 18:25:11

我正在将项目添加到c#列表框中,并希望始终将其滚动到添加到列表中的最后一个项目,以便它可见。列表通常会超过可用空间,因此会显示垂直滚动条,当用户可以移动它时,我需要用一个新项目迫使它再次跳到最后。我发现的唯一有用的方法是将TopIndex属性与框中的行(可以显示的行数)一起使用。我可以使用下面的代码,除非其中一行太长,在这种情况下,水平滚动条会占用大约最后2个项目的空间。如果我能弄清楚是否显示了水平条,我可以改变计算中的行数来解释它

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

这似乎需要做很多工作来确保新项目可见。我是不是错过了什么特别的东西?

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

您可以通过调用来检查水平滚动条是否可见

LB1.HorizontalScrollbar

根据OP的评论,以上内容不起作用。

我还想说,硬编码数字是不好的做法,你可以这样做:如何滚动到ListBox的底部?

然后这是一种自动滚动的方式http://www.csharp-examples.net/autoscroll/

这些我都没试过,但应该有效。

如果您切换到ListView,它有一个EnsureVisible函数,可以完全完成您想要的工作。

我不知道如何轻松检测水平滚动条是否显示,但这里有一个扩展方法,它可以让您滚动到最后一项,而不会引发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);

如果你不想让它只进入最后一个项目,你可以很容易地将其修改为滚动到任何项目索引。

添加项目后,如何执行以下

listBox1.SelectedIndex = listBox1.Items.Count - 1;

它将确保最后一项可见。