ListView.FindItemWithText внутри цикла WHILE завершается с ошибкой после первой строки ListView - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу изменить содержимое 2-го столбца каждой строки в ListView с различными данными в соответствии с, найденным через FindItemWith.

Моя проблема в том, что из 2-й строки происходит переопределение предыдущих столбцов, например, когда я хочу изменить содержимое, поиск текста, который остается в первой строке, работает нормально, см .:

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 голосов
/ 14 ноября 2018

Это потому, что функция перегрузки, которую вы использовали для 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. Просто найдите один раз с нуля. Используйте этот элемент для обновления.

...