我尝试从其他线程更改ListView。我收到一个错误:“System.String类型的对象无法转换为类型System.String []”。如果我不传递string []作为参数,编译器将不会编译代码。你知道什么可能是错的吗?
public delegate void UpdateListView(string[] request);
public void UpdateComponents(string[] request)
{
for (int j = 0; j < request.Length; j++)
{
switch (request[j])
{
case "ListViewSubnetworksChanged":
if (listView1.InvokeRequired)
{
UpdateListView d = new UpdateListView(UpdateComponents);
this.Invoke(d, request);
}
else
{
listView1.Items.Clear();
}
break;
}
}
}
答案 0 :(得分:0)
该方法要求一个数组,因此你不能传递一个字符串。如果您只有一个字符串,则可以创建一个包含该字符串的新数组,并调用如下方法:
string val = "Data";
string[] arrayVal = new string[] { val };
UpdateComponents(arrayVal);
或者将其简化为一行:
UpdateComponents(new string[] { val });
答案 1 :(得分:0)
没有错。 编译器得到你的语法错误,因为你试图将字符串作为参数,而 Invoke()需要的参数是string [] 您应该以正确的格式提供数据。 您可以使用STRING。 ToArray()聚合函数将字符串转换为字符串[]
顺便说一句,在这种情况下,使用 foreach 循环,以便迭代集合的数据。
答案 2 :(得分:0)
回顾你的问题和代码,我不明白为什么你会在第一时间进行递归调用。我会按如下方式简化您的代码:
private void UpdateComponents(string[] request)
{
for (int j = 0; j < request.Length; j++)
{
switch (request[j])
{
case "ListViewSubnetworksChanged":
ClearListViewItemsSafe();
break;
}
}
}
private void ClearListViewItemsSafe()
{
if (listView1.InvokeRequired)
{
this.Invoke(new Action(() => listView1.Items.Clear()));
}
else
{
listView1.Items.Clear();
}
}
此外,该代码块假定您实际上正在检查其他case
条件,并且您在其他j
块中有case
用途。如果这些都不是真的,我建议进一步优化块:
private void UpdateComponents(string[] request)
{
foreach (string r in request)
{
if (r == "ListViewSubnetworksChanged")
{
ClearListViewItemsSafe();
return;
}
}
}