2014-01-23 1 views
0

Я пытаюсь изменить ListView из другого потока. Я получаю сообщение об ошибке: «Объект типа System.String не может быть преобразован в тип System.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

Метод запрашивает массив, поэтому вы не можете передать ему строку. Если у вас есть только одна строка вы можете создать новый массив, содержащий эту одну строку и вызвать метод как это:

string val = "Data"; 
string[] arrayVal = new string[] { val }; 
UpdateComponents(arrayVal); 

Или упростить ее до одной строки:

UpdateComponents(new string[] { val }); 
0

Там нет ничего плохого. Ошибка синтаксиса компилятора, потому что вы пытаетесь передать строку в качестве параметра, в то время как параметр, который Invoke() needs is string [] Вы должны указать данные в правильном формате, указанном. Вы можете использовать STRING. ToArray() агрегатная функция для преобразования строки в строку []

Кстати, использовать Foreach петлю вместо в течение в этих случаях, что вы хотите итерацию по данным сборника.

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