无法调用方法

时间:2014-01-23 19:21:54

标签: c# listview invoke

我尝试从其他线程更改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;
        }
    }
}

3 个答案:

答案 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;
        }
    }
}