从类中访问表单元素

时间:2014-12-26 06:02:18

标签: c# winforms

我有一个包含递归函数的类。 此类在Form1中使用。 好吧,我现在想要这个函数将项添加到Form1中的ListBox1。 如果这是一个正常的函数,我只会给出我希望显示的值,如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;
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以尝试其中一种


解决方案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);

解决方案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));

解决方案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基本上是相同的,只是不同的语法糖