0

我正在将项目添加到 ListView 中,如下所示:

    private int AddThreadToListView(int threadNumber, string proxy, string query, string page, string links)
    {
        int index = 0;
        listView1.SuspendLayout();

        Invoke(new MethodInvoker(
                       delegate
                       {
                           string[] row1 = { proxy, query, page, links };
                           ListViewItem item = new ListViewItem();

                           listView1.Items.Add(threadNumber.ToString()).SubItems.AddRange(row1);
                           index = listView1.Items.Count - 1;
                       }
                       ));

        if ((listView1.Items.Count % 1000) == 0)
        {
            listView1.ResumeLayout();
            listView1.SuspendLayout();
        }

        listView1.ResumeLayout();
        return index;
    }

然后我跟踪项目索引,以便我可以返回并从我的线程中更新它。(效果很好)。

然而问题是当我开始删除这些项目时,由于某些原因索引发生了变化..

这是我的更新和删除方法:

    private void UpdateThreadListView(int threadNumber, string proxy, string query, string page, string links)
    {
        Invoke(new MethodInvoker(
                       delegate
                       {
                           listView1.BeginUpdate();

                           ListViewItem itm = listView1.Items[threadNumber];
                           itm.SubItems[1].Text = proxy;

                           itm.SubItems[2].Text = query;
                           itm.SubItems[3].Text = page;
                           itm.SubItems[4].Text = links;                               

                           listView1.EndUpdate();

                       }
                       ));
    }

    private void RemoveThreadListView(int threadNumber)
    {
        Invoke(new MethodInvoker(
                       delegate
                       {
                           listView1.BeginUpdate();
                           listView1.Items[threadNumber].Remove();
                           listView1.EndUpdate();

                       }
                       ));
    }

我不知何故需要一个不变的索引,为每个创建的列表视图项创建一个唯一的索引。

我怎么能做到这一点?

4

3 回答 3

1

是自动管理的Index;它表示给定项目在列表中的位置,因此如果您删除一个项目,所有后续项目的位置都会改变。

您可以使用 的Tag属性ListViewItem作为键来使用其他条件搜索项目;例如

private ListViewItem FindItem(object myTag)
{
    foreach(ListViewItem myItem in listView1.Items)
    {
        if (myItem.Tag.Equals(myTag))
            return myItem;
     }
     return null;
}

Tag可以设置为您希望的任何对象;它本质上就是为了这个目的(通过索引以外的方式唯一标识节点)。

请注意,这将比使用索引查找元素效率低,因为它是最坏的情况O(n)(与O(1)索引相反)。

编辑:

上面的方法只是一个例子,说明如何找到一个给定标签的项目。您可以随时设置标签,但通常您可能希望在创建列表视图项时设置它,例如

    Invoke(new MethodInvoker(
                   delegate
                   {
                       string[] row1 = { proxy, query, page, links };
                       ListViewItem item = listView1.Items.Add(threadNumber.ToString());

                       item.SubItems.AddRange(row1);
                       item.Tag = threadNumber.ToString(); // or whatever you want to search by
                       index = listView1.Items.Count - 1;
                   }
                   ));

然后,假设你实现了FindItem()我上面给出的例子,你可以这样做:

var item = FindItem("3"); // returns the item tagged with "3"

在此示例中,它将返回线程 #3 的项目。

于 2012-11-26T20:02:56.293 回答
0

ListViewItems 的索引更改的事实对于 ListView 来说是正确的行为,因为索引只是它在 UI 控件中的位置。

但是,如果您想跟踪该项目,我不建议您跟踪索引。相反,跟踪 ListViewItem 本身。

现在您可以直接操作 ListViewItem,因为您可以直接引用它。刷新 ListView 后,您应该会看到对该项目所做的任何更改。

这是一个简单的示例,应该可以引导您朝着正确的方向前进。假设我有一个包含 3 行的 ListView,并且我想在删除第二行后更新最后一项。

//Grab a reference to the item that I want to update
ListViewItem lvi = this.lvwData.Items[2];

//Remove the second row
this.lvwData.Items.RemoveAt[1];

//Update the ListViewItem
lvi.Text = "Updated";

//Refresh the ListView
this.lvwData.Refresh();
于 2012-11-26T20:08:27.130 回答
0

将 int threadNumber 复制到本地 int

 private void UpdateThreadListView(int threadNumber, string proxy, string query, string page, string links)
    {
        int index = threadNumber;
        Invoke(new MethodInvoker(
                       delegate
                       {
                           listView1.BeginUpdate();

                           ListViewItem itm = listView1.Items[index];
etc..

试图找出原因是什么...

于 2012-11-26T19:59:24.680 回答