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

3
我正在向 C# 的列表框中添加项目,希望它总是滚动到列表中最后一个添加的项目,以便用户可以看到。由于列表通常超出可用空间,因此垂直滚动条将显示出来,而且由于用户可以移动滚动条,我需要强制它跳到最后一个项目。我发现唯一有用的方法是使用 TopIndex 属性和列表中的行 - 可显示的行数。我已经使用下面的代码使其正常工作,除非其中一行过长,这时水平滚动条会占用大约最后两个项目的空间。如果我能找出水平滚动条是否被显示,我可以更改计算中的行数来考虑它的影响。
        LB1.Items.Add(strText);
        LB1.TopIndex = Math.Max(0,lbXmlMsg.Items.Count - 10); // 10 rows visible

这似乎是很多工作,只是为了确保一个新项目可见。我是否漏掉了什么显而易见的东西?

你没有错过任何东西,只是在需要添加滚动条时出现了问题,我相信我已经看到过很多关于这个问题的主题,只是现在不确定有哪些。 - Sayse
3个回答

1

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

LB1.HorizontalScrollbar

根据OP的评论,上述方法不起作用。
我还想说硬编码数字是不好的做法,你可以这样做: 如何滚动到ListBox的底部? 然后有一种自动滚动的方法http://www.csharp-examples.net/autoscroll/ 我没有尝试过任何一种方法,但它们应该有效。
如果你切换到ListView,它有一个EnsureVisible函数,可以完全满足你的需求。

HorizontalScrollbar属性始终为true,以允许在必要时创建它,因此并没有帮助。ListView的想法很好,但似乎仅仅替换类型是不够的。我稍后会尝试一下。你们真的帮了我大忙——一个小时内得到了两个有用的回复。非常感谢! - John James

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

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


0

在添加完项目后,你可以执行以下操作

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

这将确保最后一个项目可见。


1
那是一个好建议。然而,我不想选择它,但之后添加LB1.SelectedIndex = -1可以解决这个问题。 - John James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接