我有一个从多个线程更新的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作为项目索引(因为项目被删除)有没有其他方式我可以实现这一点?也许是通过定位“用户”子项目?然后从中得到子项?
答案 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));