Listbox RemoveAt方法导致AutoScroll

时间:2011-11-10 15:55:48

标签: c# listbox autoscroll

Nutshell:当我调用RemoveAt(0)时,如何禁用自动滚动到ListBox的顶部?

背景:
我有一个简单的列表框,我定期将所有数据混合在一起。

基本上我使用它是一种状态报告工具。

我的程序的每次迭代都会导致100行左右的数据被抛入列表框中,最好的方法是将信息堆放在最底层。总是将它添加到底部。

我希望最新的结果位于底部,最旧的结果是“推高”。由于此列表框的大小在短时间后变得相当大,我将大小限制为1000个项目。

当盒子超过1000件时,我使用RemoveAt(0)直到我再次获得1000件物品。

要始终显示最相关的信息,我会将列表框一直向下滚动。这个问题是每当我调用RemoveAt(0)时,该框会自动滚动回到新项目0.基本上,每次我将项目添加到“完整”列表框时,效果都是快速向上滚动1000个项目,然后退回1000个项目,使得显示笨拙。

当我调用RemoveAt(0)时,如何禁用自动滚动回ListBox的顶部?

2 个答案:

答案 0 :(得分:1)

只有在没有选定项目时才会发生这种情况。或者换句话说,ListBox.SelectedIndex = -1。简单的解决方法是选择一个项目。就像最后一个一样。

答案 1 :(得分:0)

我无法回答你的问题。即使我了解这项技术,我也可能没有满足您需求的答案。问题的一部分是你问“帮助我解决这个问题,我试图解决它”,而不是“这是业务问题,什么是最好的解决方案”。

我的建议:回到核心问题,这听起来像“我需要一种用新事件更新'列表'的方法,同时保持列表不超过1000项”。从这里,您有一个ListBox附加到底部的解决方案,并从顶部清除作为您的解决方案。而且,我不确定如何关闭解决方案中的滚动,但我不相信这是解决业务问题的唯一方法。

细分,有几个问题要回答:

  1. 如何绑定/更新数据?
  2. 当我更改绑定的项目数时,如何防止控件滚动到新位置?
  3. 就绑定而言,编程添加是一个选项,无论您是从底部添加还是修剪顶部还是添加到顶部和修剪底部。另一种是组装数据并重新绑定。我想还有其他人。

    滚动问题实际上不是滚动问题,而是“记住我正在看的问题”或“始终显示最新”问题。如果总是显示最新的,您需要找到一种方法,以确保在添加或删除某些内容时您已结束。如果用户可以改变位置,您需要有一种存储位置并返回该位置的方法。您添加了一些复杂性,因为您的列表长度可以是1到1000个项目,因此除非总是在底部,否则滚动位置是冒险的,除非您以百分比工作。无论关闭滚动是否解决了当前问题,如果有业务需求要记住用户的位置,您应该在更新数据后进行检查。

    作为最后一个建议,看看其他人如何解决显示流数据的问题。遵循一个众所周知的模式是一个好主意,因为它为用户提供了熟悉的界面。通常,对于流数据,流具有非常小的行集(足以填充屏幕,而不是1000),但是如果需要,允许您返回并查看先前“已记录”的事件。再一次,我不确定您的解决方案是否需要流式解决方案,但您仍然应该回到核心业务问题并从那里开始。