我想用通过ListView
找到的不同数据更改FindItemWith
每行第二列的内容。
我的麻烦是,第二行的内容将覆盖前几列,例如,当我要更改内容时,搜索停留在第一行的文本可以正常工作,请参阅:
当我想要更改内容以搜索停留在第二行的文本时,就会发生这种情况:
这是代码:
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);
}
最佳答案
这是因为用于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
。只需从零开始搜索一次。使用该项目进行更新。
关于c# - 在第一个ListView行之后,WHILE循环内的ListView.FindItemWithText失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53291704/