2012-12-16 26 views
0

我正在尝试使用另一个类将某些内容添加到Form1的列表框中。我怎么做?在另一个类中调用控件

这是我当前的代码:

Form1.cs的

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void writeTest(string items) 
    { 
     this.listBox1.Items.Add(items); 
    } 
} 

test.cs中

class Test 
{ 
    Form1 frm1 = new Form1(); 

    public void test() 
    { 
     frm1.writeTest("Hello"); 
    } 
} 
+0

内有什么问题你当前的代码? – hattenn

+0

Form1是您的启动表单吗? –

回答

0

哪里 “测试” 类从何而来?我将假设它是在Form1中创建的。您可以在创建时将Form1的引用传递给Test。例如:

public Form1() { 
    test = new Test(this); 
} 


class Test { 
    private Form1 form; 
    public Test(Form1 f) { 
    form = f; 
    } 
    ... 

然后,您可以从Test内部访问表单。

+0

测试类不在Form1中,但我会尝试您的代码并对其进行修改。谢谢! – user1621338

+0

“Test”类究竟在哪里?只要该方法所在的类是从另一个线程调用的,那就没有关系了。 – hattenn

0

您的示例结果非常高。这是你不想要的东西。有各种技术可以使用。首先你可以看看SOLID原则(如果你还没有这样做):http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

特别是D部分(依赖倒置)。因此,在您的示例中,您可以使用名为AddTestItem的方法创建一个名为IAddTestItem的界面。但是,这仍然可能并不理想。

我怀疑你会通过使用排序的消息机制(观察者模式)获得更多。所以你可以有一个MessageBus的共享(注入)实例。您的表单和您的类都可以使用类似依赖注入的方式接收相同的实例(但也可以使用其他机制)。然后,您的课堂可以发布一些消息,如AddTestItem(更多命令),甚至可以发布TestItemAdded,如果仅仅是通知任何听众该事件已经发生,并且他们可以自由使用他们认为合适的数据:例如添加到列表框。

但是,如果您不以某种方式解耦您的代码,您肯定会遇到维护问题。

0

这是战略模式版本的示例。这里我们使用中介器,它控制列表框的加载。

public partial class Form1 : Form 
{ 
    private IMediator _mediator; // any class deriving from IMediator 

    public Form1(IMediator mediator) 
    { 
     InitializeComponent(); 
     _mediator = mediator; 
     LoadList(); 
    } 

    private void LoadList() 
    { 
     // in strategy you might supply different mediators, each may load listbox with different type of items. You pass reference to your control. Load logic is totally up to the external class, such as mediator. 
     _mediator.LoadList(this.listBox1); 
    } 
} 

这是使用示例性负载控制的不同类模式