WinForms ListView,记住Reload上的滚动位置

djd*_*d87 12 c# listview listviewitem .net-2.0 winforms

我有一个列表视图,我正在填充8列用户数据.用户可以选择启用自动刷新,这会导致ListView被清除并使用数据库中的最新数据重新填充.

问题是当项目被清除并重新填充时,可见区域会跳回到列表的顶部.因此,如果我正在查看2000年的第1000项,那么回到那个项目是非常不方便的.

基本上,我要问的是,如何获得当前的滚动距离(x和y),然后恢复它们?

The*_*ent 15

我只是想为那些拼命尝试使用有缺陷的ListView.TopItem属性的人提供一些信息:

  1. 您必须在调用ListView.EndUpdate后设置TopItem属性
  2. ListView控件的项必须将其Text属性设置为String.Empty以外的其他属性,否则该属性将不起作用.
  3. 设置ListView.TopItem会间歇性地抛出空引用异常.始终将此行代码保留在Try ... Catch块中.

当然,这会导致ListView的滚动条跳转到0并返回到顶部项目的位置,这很烦人.如果您找到此问题的解决方法,请更新此问题.


Dav*_*cre 8

我成功使用了以下内容:

int topItemIndex = 0;
try
{
     topItemIndex = listView1.TopItem.Index;
}
catch (Exception ex)
{ }
listView1.BeginUpdate();
listView1.Items.Clear();
//CODE TO FILL LISTVIEW GOES HERE
listView1.EndUpdate();
try 
{ 
    listView1.TopItem = listView1.Items[topItemIndex];
}
catch (Exception ex)
{ }
Run Code Online (Sandbox Code Playgroud)


Grz*_*nio 6

不久前我遇到了同样的问题,我最终实现了一种算法来将模型与列表进行比较,所以我只添加/删除了已更改的元素。这样,如果没有发生重大变化,列表就不会跳到开头。我想要实现的主要目标是效率(这样列表就不会闪烁)。