C# Listbox RemoveAt方法导致自动滚动

C# Listbox RemoveAt方法导致自动滚动,c#,listbox,autoscroll,C#,Listbox,Autoscroll,简而言之:当我调用RemoveAt(0)时,如何禁用自动滚动回列表框顶部 背景: 我有一个简单的列表框,每隔一段时间我会将所有数据混合在一起 基本上我用的是一个状态报告工具 我的程序每次迭代都会导致100行左右的数据被抛出到列表框中,而将成堆的信息转储到列表框中的最佳方法是始终将其添加到列表框的底部 我希望最新的结果在底部,最旧的结果被“推上”。因为这个列表框的大小在短时间内变得相当大,所以我将其大小限制为1000个项目 当盒子中的物品超过1000件时,我使用RemoveAt(0),直到我再次获

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

背景:
我有一个简单的列表框,每隔一段时间我会将所有数据混合在一起

基本上我用的是一个状态报告工具

我的程序每次迭代都会导致100行左右的数据被抛出到列表框中,而将成堆的信息转储到列表框中的最佳方法是始终将其添加到列表框的底部

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

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

为了始终显示最相关的信息,我向下滚动列表框。问题在于,每当我调用RemoveAt(0)时,该框都会自动滚动回新的项0。基本上,每次我将项目添加到“完整”列表框时,其效果是快速向上滚动1000个项目,然后向下滚动1000个项目,从而形成一个笨拙的显示效果


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

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

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

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

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

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


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

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

    取决于您的平台--winforms、silverlight、wpf、asp.net(等)Microsoft Visual C#2008 Express(winforms)不确定这是否可行,但请尝试调用
    列表框。在调用
    RemoveAt(0)
    之前,请先开始更新。然后将所选项目设置为列表中的最后一项,最后调用
    EndUpdate
    。这将阻止列表框在调用
    EndUpdate
    之前进行更新。@Jim,这很有效,效果很好!没有闪烁,漂亮干净,这就是我正在实现的!感谢您的贡献,我将研究更好的方法来显示更新流。我的问题的目的是了解调用listbox.RemoveAt winforms方法时会发生什么,以及如何修改该行为。这起作用并解释了listbox删除项时会发生什么。这实际上停止了无关的滚动,而不仅仅是隐藏它。然而,我正在执行吉姆的建议,使事情看起来更好。