Получить элемент [i] из списка - PullRequest
0 голосов
/ 23 февраля 2011

Я пытаюсь получить элемент [i] в ​​строку из ListView. Я просто не понимаю, что я должен делать, когда ListView находится в другом потоке.

public delegate void getCurrentItemCallBack (int location);
...
private void runAsThread()
{
   While (..>i)
   {
    //I tried the following //Doesn't work.
    //string item_path = listView.Item[i].toString();   

    //attempting thread safe. How do I get it to return a string?
    string item_path = GetCurrentItem(i);
   }
}
private void GetCurrentItem(int location)
{
   if (this.listViewModels.InvokeRequired)
      {
       getCurrentItemCallback d = new getCurrentItemCallback(GetCurrentItem);
       this.Invoke(d, new object[] { location });
      }
      else
      {
       this.listViewModels.Items[location].ToString();
      }
}

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Для начала вам нужно иметь тип делегата, который возвращает строку, а не void.

Затем вам также понадобится соответствующий метод для возврата строки.

public delegate string getCurrentItemCallBack (int location);

...

private string GetCurrentItem(int location)
{
   if (this.listViewModels.InvokeRequired)
      {
       getCurrentItemCallback d = new getCurrentItemCallback(GetCurrentItem);
       return this.Invoke(d, new object[] { location });
      }
      else
      {
       return this.listViewModels.Items[location].ToString();
      }
}
0 голосов
/ 27 ноября 2012

Намного проще и читабельнее IMO для использования лямбда-действия, не возиться с обратными вызовами или делегатами

   private void GetCurrentItem(int location)
   {
         if (this.listViewModels.InvokeRequired)
         {
             Invoke( new Action ()=>{
                //do what ever you want to do here
                // this.listViewModels.Items[location].Text;
             })); 
         }
         else
         {
          this.listViewModels.Items[location].Text;
         }
   }
...