listView删除行和更新

时间:2012-05-16 13:17:53

标签: c# listview

我有一个从多个线程更新的listView,其中显示了线程状态和ID。线程结束后,项目将被删除。

我的问题是我用来更新listView的方法是使用listViews ID(找到我想要更新的子项)。现在,当listView项开始被删除时,我遇到了问题,因为特定线程的ID已经改变了..

以下是我目前用于更新和删除的代码:

    private void AddToListViewThread(string user, string status, int threadNumber)
    {
        Invoke(new MethodInvoker(
                       delegate
                       {
                           listView2.BeginUpdate();
                           this.listView2.Items[threadNumber].SubItems[1].Text = user;
                           this.listView2.Items[threadNumber].SubItems[2].Text = status;
                           listView2.EndUpdate();
                       }
                       ));
    }

    private void RemoveFromListViewThread(int threadNumber)
    {
        Invoke(new 
            MethodInvoker(
                       delegate
                       {
                           listView2.BeginUpdate();
                           this.listView2.Items.RemoveAt(threadNumber);
                           listView2.EndUpdate();
                       }
                       ));
    }

我现在明白我不能使用threadNumber作为项目索引(因为项目被删除)有没有其他方式我可以实现这一点?也许是通过定位“用户”子项目?然后从中得到子项?

3 个答案:

答案 0 :(得分:1)

您可能希望查看ListViewItem.Tag以查看它是否适用于您的特定方案。您可以在创建时将线程的ID存储在项目的标记中,如果您删除ListView中的其他项目,它将不会更改。

http://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem.tag.aspx

答案 1 :(得分:1)

使用ListViewItem的tag属性存储不同的索引(类似于SQL自动增量)。

Tag属性是一个用于存储项目元数据的字段。

通过简单的二进制搜索,您可以在Log(n)时间内找到要删除的项目。

您的代码如下所示:

private void AddToListViewThread(string user, string status, int threadNumber)
{
    Invoke(new MethodInvoker(
                   delegate
                   {
                       listView2.BeginUpdate();
                       int i = SearchItem(listView2, threadNumber);
                       if ( i > -1)
                       {
                       this.listView2.Items[i].SubItems[1].Text = user;
                       this.listView2.Items[i].SubItems[2].Text = status;
                       }
                       listView2.EndUpdate();
                   }
                   ));
}

private void RemoveFromListViewThread(int threadNumber)
{
    Invoke(new MethodInvoker(
                   delegate
                   {
                       listView2.BeginUpdate();
                       int i = SearchItem(listView2, threadNumber);
                       if ( i > -1)
                       {
                           this.listView2.Items.RemoveAt(i);
                       }
                       listView2.EndUpdate();
                   }
                   ));
}

private int SearchItem(ListView list, int id)
{ 
         for (int i  = 0; i < list.Items.Count; i++) // I used sequential search but you can implement binary instead
         {
            if (((int)list.Items[i].Tag) == id) return i;
         }
         return -1;
}

答案 2 :(得分:-1)

试试这个 - &gt; this.listView2.Remove(this.listView2.Items.FindByValue(threadNumber));