【问题标题】:How can I tell if the horizontal scroll bar is displayed on a list box如何判断水平滚动条是否显示在列表框上
【发布时间】:2013-07-28 14:12:24
【问题描述】:

我正在向 C# 列表框中添加项目,并希望始终将其滚动到添加到列表中的最后一个项目,以便它可见。该列表通常会超出可用空间,因此将显示垂直滚动条,并且当​​用户可以移动它时,我需要使用新项目再次强制它跳转到末尾。我发现的唯一有用的方法是将 TopIndex 属性与框中的行一起使用 - 可以显示的行数。我使用下面的代码可以正常工作,除非其中一行太长,在这种情况下,水平滚动条会占用大约最后 2 个项目的空间。如果我能确定是否显示了水平条,我可以更改计算中的行数来解决它。

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

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

【问题讨论】:

  • 你没有遗漏任何东西,只是在需要时添加滚动条的问题,我相信我已经看到了很多这方面的主题,只是现在还不确定

标签: c# listbox


【解决方案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】:

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

    LB1.HorizontalScrollbar
    

    根据 OP 的评论,上述方法不起作用。

    我还要说硬编码数字是不好的做法,你可以这样做: How to scroll to bottom of ListBox?

    然后有一种方法可以自动滚动http://www.csharp-examples.net/autoscroll/

    我没有尝试过这些,但它们应该可以工作。

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

    【讨论】:

    • Horizo​​​​ntalScrollbar 属性始终为 true 以允许在必要时创建它,因此不需要帮助。 ListView 的想法是一个很好的想法,但似乎只是替换类型就足够了。我稍后会尝试一下。伟大的帮助家伙 - 一小时内有 2 个有用的回复。最感动
    【解决方案3】:

    添加项目后如何进行以下操作

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

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

    【讨论】:

    • 这是个好建议。但是我不希望它被选中,但之后添加 LB1.SelectedIndex = -1 解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多