2014-01-12 94 views
1

我的要求是隐藏ListView中的特定行。由于没有内置功能,因此我使用ListView_DrawItem事件来隐藏特定行。我能够隐藏行,但问题是有一个balnk空间来了,如果我添加一个行的帖子到隐藏的行。ListView隐藏行

请找到下面的代码:

ListViewItem LVI = listView1.Items.Add("1"); 
LVI.SubItems.Add("Srikanth"); 
ListViewItem LVI1 = listView1.Items.Add("2"); 
LVI1.SubItems.Add("Suresh"); 

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) 
{ 
    if (e.Item.Text != "2") 
    { 
     e.DrawDefault = true; 
    } 
} 

输出类似于

1 SRIKANTH

3桑迪

想删除空间B/W 1 & 3记录

任何帮助表示赞赏

回答

0

你并没有真正隐藏物品,这很明显。相反,您提供自己绘制它们,并将其传递给默认渲染。项目在那里无论如何。

我的方法是操作集合,只添加列表框需要处理的项目。

根据您手头的数据,保留完整列表的本地副本(例如按照通用List<YourDataClass>的顺序)。另外,保留一个'隐藏'索引列表。

尊重的List<T>顺序和循环穿过它,只会增加新的ListViewItem对象,这些索引出现在“隐藏”列表。

private List<String[]> _listItems = new List<String[]>(); 
private List<Int32> _hiddenIndexes = new List<Int32>(); 

private void UpdateCollection() 
{ 
    listBox.Items.Clear(); 
    for (Int32 i = 0; i < _listItems.Count; i++) 
    { 
     if (!_hiddenIndexes.Contains(i)) 
      listBox.Items.Add(new ListBoxItem(_listItems[i])); 
    } 
} 

请注意,如果这是一个包含大量项目的列表,它可能不是最有效的方法。