0

複数のスレッドから更新されている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 をアイテムのインデックスとして使用できないことを理解しました (アイテムが削除されるため) これを達成できる他の方法はありますか? おそらく「ユーザー」サブアイテムをターゲットにすることでしょうか?それからサブアイテムを取得しますか?

4

3 に答える 3

1

ListViewItem の tag プロパティを使用して、別のインデックスを格納します (SQL autoincrement と同様)。

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;
}
于 2012-05-16T13:28:23.670 に答える
0

ListViewItem.Tag を調べて、特定のシナリオで機能するかどうかを確認することができます。作成時にアイテムのタグにスレッドの ID を保存できます。ListView で他のアイテムを削除しても変更されません。

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

于 2012-05-16T13:28:07.287 に答える
-1

これを試してください->this.listView2.Remove(this.listView2.Items.FindByValue(threadNumber));

于 2012-05-16T13:23:33.560 に答える