在另一个类中调用一个控件

时间:2012-12-16 05:49:03

标签: c# winforms

我正在尝试使用另一个类向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");
    }
}

3 个答案:

答案 0 :(得分:0)

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

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


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

然后,您可以从Test中访问该表单。

答案 1 :(得分:0)

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

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

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

但如果你不以某种方式解密代码,你肯定会遇到维护问题。

答案 2 :(得分:0)

这是策略模式版本的示例。这里我们使用mediator来控制listbox的加载。

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

这是使用模式

中的不同类加载控件的示例