2014-12-26 2 views
1

У меня есть класс, который включает рекурсивную функцию. Этот класс используется в Form1. Ну, теперь я хочу, чтобы эта функция добавляла элементы в список ListBox1 в Form1. Если бы это была нормальная функция, я бы просто дал значение, которое я хотел бы отобразить в ответ, например Listbox1.items.add(Obj.ListDirectiory());. Какие возможности могут передать значение из моей рекурсивной функции в ListBox?Элемент формы доступа из класса

public void ListDirectory(FtpClient client, string path) 
    { 
     try 
     { 
      foreach (FtpListItem item in client.GetListing(path)) 
      { 
       if (item.Type == FtpFileSystemObjectType.Directory) 
       { 
        Console.WriteLine("Folder: " + item.FullName); 
        //This is where I want to add something to ListBox1 

        //call the function again... 
        ListDirectory(client, item.FullName); 
       } 
       else 
       { 
        Console.WriteLine("File: " + item.FullName); 
        //This is where I want to add something to ListBox1 
       } 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

ответ

0

Вы можете попробовать один из этих


Solution 1 Используйте класс эталонного

public class MyFunkyClass 
{ 
    public ListBox ListBox { get; set;} 
    public void ListDirectory(FtpClient client, string path) 
    { 
     // stuff 
     Listbox.Items.Add(item.FullName) 
     // stuff 
     ListDirectory(client, item.FullName); 
    } 
} 

// Usage 

var myFunkyClass = new MyFunkyClass() { ListBox = listBox1} 

myFunkyClass.ListDirectory(client,path); 

Solution 2 Используйте метод эталонных

public class MyFunkyClass 
{  
    public void ListDirectory(FtpClient client, string path, Listbox listbox) 
    { 
      // stuff 
      listbox.Items.Add(item.FullName))  
      // stuff 
      ListDirectory(client, item.FullName, listbox); 
    } 
} 

// Usage 

var myFunkyClass = new MyFunkyClass() 

myFunkyClass.ListDirectory(client,path,listBox1); 

Решение 3 Использование Действие

public class MyFunkyClass 
{ 

    public void ListDirectory(FtpClient client, string path, Action<string> myAction) 
    { 
      // stuff 
      myAction(item.FullName) 
      // stuff 
      ListDirectory(client, item.FullName, myAction); 
    } 

} 

// Usage 

var myFunkyClass = new MyFunkyClass() 

Action<string> myAction = (value) => { 
    listBox1.Items.Add(value); 
}; 

myFunkyClass.ListDirectory(client,path,myAction); 

// or 

myFunkyClass.ListDirectory(client,path, value => listBox1.Items.Add(value)); 

Solution 4 Используйте делегат

public class MyFunkyClass 
{ 

    public delegate void MyDelegate(string value); 

    public void ListDirectory(FtpClient client, string path, MyDelegate myDelegate) 
    { 
      // stuff 
      myDelegate(item.FullName) 
      // stuff 
      ListDirectory(client, item.FullName, myDelegate); 
    } 

} 

// Usage 

var myFunkyClass = new MyFunkyClass() 

myFunkyClass.ListDirectory(client, path, value => listBox1.Items.Add(value))); 

Есть много способов достижения такого рода вещи или различные комбинации выше, однако это должно дать вам несколько идей

Обновление

Как было отмечено в комментариях, решение 3 и 4, по сути, одно и то же, только другой синтаксический сахар

+0

Решение 3 и 4 в значительной степени идентичны. – Maarten

+0

@Maarten, Действительно, они оба - просто делегаты, однако я думал, что идентификатор получает разнообразие в нем, и надеюсь, что некоторые upvotes получат меня до 1000, подталкивайте подталкивать wink :), я мог бы добавить примечание об этом, хотя для ясности , спасибо –

+1

Все, что вы хотите на Рождество, - 1000 очков и кольцо власти? – RenniePet

Смежные вопросы