2012-07-09 53 views
0

我有一个包含一些HashTablesArrayList,我有一个ListView包含一些项目。对数组列表匹配列表视图中的项目在C#

我需要的是将数组列表与列表项匹配。

如果一个项目在列表视图中而不在数组列表中,那么它应该从列表视图中移除。

如果不在列表视图或数组列表中,则将其添加到列表视图中。

这是一些代码:

ArrayList online_list = users; 
foreach (Hashtable i in online_list) 
      { 
        ListViewItem item = new ListViewItem(); 
        item.Text = (string)i["u_name"]; 
        item.Name = (string)i["id"]; 
        item.ImageIndex = 0; 
        lstvUsers.Items.Add(item); 
      } 

该代码将所有的数组列表项目列表视图,而不检查!

+2

你还在1.1或为什么你使用的ArrayList和哈希表? – 2012-07-09 22:07:59

+0

我在3.5上使用它们,因为我从PHP web服务recive数据返回相关数组和阵列数组,所以我必须使用它们,如果你知道更好的解决方案指向它,但我仍然需要回答 – 2012-07-09 22:10:52

回答

0

你可以先clearListView的所有项目,再加入所有在ArrayList

lstvUsers.Clear(); 
foreach (Hashtable i in online_list) 
{ 
    ListViewItem item = new ListViewItem(); 
    item.Text = (string)i["u_name"]; 
    item.Name = (string)i["id"]; 
    item.ImageIndex = 0; 
    lstvUsers.Items.Add(item); 
} 

您应该使用的ListView.Clear代替ListView.Items.Clearhttps://stackoverflow.com/a/10170049/284240

编辑:既然你是坚定的您只想从ListView中删除不在ArrayList中的项目,并添加不在ListView中但在ArrayList中的项目。由于您需要将ListView中的每个项目与ArrayList中的每个项目进行比较(反之亦然),而不是比较任何内容,因此该方法的效率明显较低。

例如:

var addItems = online_list 
    .Cast<Hashtable>() 
    .Where(ht => !lstvUsers.Items.ContainsKey((string)ht["id"])); 
var removeItems = lstvUsers.Items 
    .Cast<ListViewItem>() 
    .Where(lvi => !online_list.Cast<Hashtable>().Any(ht => (string)ht["id"] ==lvi.Name)); 

foreach (var removeItem in removeItems) 
{ 
    lstvUsers.Items.Remove(removeItem); 
} 
foreach (var addHashTable in addItems) 
{ 
    ListViewItem item = new ListViewItem(); 
    item.Text = (string)addHashTable["u_name"]; 
    item.Name = (string)addHashTable["id"]; 
    lstvUsers.Items.Add(item); 
} 
+0

我已经这样做现在但由于我每3秒刷新一次内容,它会闪烁@列表视图,并删除任何选择,如果我做了! – 2012-07-09 22:20:05

+0

改为使用ListView.Clear,相应地编辑问题。 – 2012-07-09 22:22:51

+0

@SamyMassoud:你也可以在'lstvUsers.Items'之前使用['ListView.BeginUpdate'](http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.beginupdate.aspx)。循环后清除();'和['ListView.EndUpdate'](http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.endupdate)。那会更快。 – 2012-07-09 22:37:26