0

我正在尝试使用另一个类向 Form1 的列表框中添加一些内容。我怎么做?

这是我当前的代码:

Form1.cs

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

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

测试.cs

class Test
{
    Form1 frm1 = new Form1();

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

3 回答 3

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

这是在模式中使用不同类加载控件的示例

于 2012-12-17T02:55:15.250 回答
0

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

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


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

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

于 2012-12-16T05:55:34.520 回答
0

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

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

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

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

于 2012-12-16T06:08:16.827 回答