2

简而言之:当我调用 RemoveAt(0) 时,如何禁用自动滚动回 ListBox 顶部?

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

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

我的程序的每次迭代都会导致大约 100 行数据被放入列表框中,而将大量信息转储到其中的最佳方法是始终将其添加到底部。

我希望最新的结果位于底部,而最旧的结果被“推高”。因为这个列表框的大小在短时间内变得相当大,所以我将大小限制为 1000 个项目。

当盒子获得超过 1000 个项目时,我使用 RemoveAt(0) 直到我再次获得 1000 个项目。

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

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

4

2 回答 2

1

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

于 2011-11-10T16:32:14.380 回答
0

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

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

分解,有几个问题需要回答:

  1. 如何绑定/更新数据?
  2. 当我更改绑定的项目数时,如何防止控件滚动到新位置?

至于绑定,程序添加是一种选择,无论您是从底部添加并修剪顶部还是添加到顶部并修剪底部。另一种是组装数据并重新绑定。我想还有其他人。

滚动问题并不是真正的滚动问题,而是“记住我在看什么”问题或“始终显示最新”问题。如果总是显示最新的,您需要找到一种方法来确保在添加或删除某些内容时您处于最后。如果用户可以改变位置,你需要有一种方法来存储他在哪里并回到那个位置。您增加了一些复杂性,因为您的列表可以是 1 到 1000 项长,所以滚动位置,除了总是在底部,是冒险的,除非您以百分比工作。不管关闭滚动是否能解决眼前的问题,如果有业务需要记住用户的位置,你应该在数据更新后有一个检查步骤。

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

于 2011-11-10T16:14:20.193 回答