我有一个ListView,显示大约300个项目。当某些内容发生变化并且我需要重新填充列表时,我希望滚动位置保持不变,因此相同的项目仍然可见并且位于列表中的相同位置。 “EnsureVisible”方法很糟糕,因为它满足“可见”,而不是相同的位置(结果是感兴趣的项目总是滚动到列表的底部)。
我对此问题的解决方案是保存List-> TopItem的(我的)“ID”,重新填充列表,然后调用List-> TopItem = newItemWithSameID(需要设置两次以便为某些人工作)原因)。这可以作为基本“未组合”列表的魅力。
但是 - 如果List有“ShowGroups = true”,这将无效。然后,TopItem属性将始终是列表中的第一个项目,而不是文档中所说的第一个VISIBLE项目。
有解决方案吗?我用Google搜索,发现另一个失去了灵魂同样的问题。他对微软的支持有一个相当有趣的讨论,没有成功。(http://social.msdn.microsoft.com/Forums/en/winforms/thread/8a81c5a6-251c-4bf9-91c5-a937b5cfe9f3)。
所以 - 我的问题是:有解决方法吗?我真的需要将列表分组,当列表发生变化时,我真的很讨厌列表。
我不会在这里粘贴任何代码,因为您需要重现的所有代码都在上面的讨论中。
非常感谢!
答案 0 :(得分:0)
以下是我用于此问题的解决方法:
public ListViewItem RealTopItem
{
int i = 0;
while (i < Items.Count && !ClientRectangle.Contains(Items[i].Bounds))
i++;
return Items[i];
}
不幸的是,在我的代码中工作了一年之后,它刚刚在while语句中失败了。在我的故障排除中,我首先尝试停用组,问题就消失了。然后,当我再次重新激活组时,问题从未重新解决。我现在不知道那里可能出现什么问题。