在第一个ListView行之后,WHILE循环内的ListView.FindItemWithText失败

时间:2018-11-14 01:01:45

标签: c# listview visual-studio-2013

我想用通过FindItemWith找到的与之不同的数据来更改ListView每行第二列的内容。

我的麻烦是第二行的内容将覆盖前几列,例如,当我要更改内容时,搜索停留在第一行的文本可以正常运行,请参阅:

enter image description here

当我想要更改内容以搜索停留在第二行的文本时,就会发生这种情况:

enter image description here

这是代码:

public void fillData(string search, string data, ListView haystack)
{
    if (haystack.Items.Count > 0)
    {
        int idx = 0;
        ListViewItem found;

        while (idx < haystack.Items.Count)
        {

            found = haystack.FindItemWithText(search, true, idx);

            if (found != null)
            {
                haystack.Items[idx].SubItems[1].Text = data.ToString();
            }

            idx++;
        }
    }
}

private void button3_Click(object sender, EventArgs e)
{
    int i = 0;

    while (i < 3)
    {

        ListViewItem item = new ListViewItem();
        item.Text = i.ToString();
        item.SubItems.Add("192.168.0." + i.ToString());

        listView1.Items.Add(item);

        i++;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    fillData("192.168.0.0", "AAA", listView1);
}

private void button2_Click(object sender, EventArgs e)
{
    fillData("192.168.0.1", "BBB", listView1);
}

1 个答案:

答案 0 :(得分:0)

这是因为您用于FindItemWithText的重载函数会不断从传递的索引中搜索所有项目。

当循环的idx = 0时,FindItemWithText将尝试搜索0,1,2的所有三个项目。

当循环的idx = 1时,FindItemWithText将尝试搜索两个项目1,2。

当循环的idx = 2时,FindItemWithText将尝试仅搜索一项2。

因此,在第一种情况下,当您搜索第一项时,您的循环仅发现了一次。但是,在第二种情况下,当您搜索第二项时,它被发现两次(idx = 0 ---- 0,1,2)和(idx = 1 ---- 1,2)两次迭代。因此,您正在更新idx = 0和idx = 1的两个值。

这是文档链接

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listview.finditemwithtext?view=netframework-4.7.2#System_Windows_Forms_ListView_FindItemWithText_System_String_System_Boolean_System_Int32_

FindItemWithText如何返回System.Windows.Forms.ListViewItem。只需从零开始搜索一次。使用该项目进行更新。