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

あなたの例は非常に高い結合度をもたらします。これはあなたが望まないものです。使用できるさまざまな手法があります。まず、SOLIDの原則を確認できます(まだ行っていない場合):http://en.wikipedia.org/wiki/SOLID_%28object-Oriented_design%29

特にD部分(依存性逆転)。したがって、あなたの例ではIAddTestItem、というメソッドで呼び出されるインターフェースを持つことができますAddTestItem。ただし、これはまだ理想的ではありません。

ある種のメッセージングメカニズム(オブザーバーパターン)を採用することで、より多くの利益が得られると思います。したがって、の共有(注入)インスタンスを持つことができますMessageBus。フォームとクラスの両方が、依存性注入のようなものを使用して同じインスタンスを受け取ることができます(ただし、他のメカニズムを使用することもできます)。次に、クラスはAddTestItem(コマンドの詳細)のようなメッセージを公開できます。またはTestItemAdded、イベントが発生したことをリスナーに通知するだけで、リストボックスへの追加など、適切と思われるデータを自由に使用できます。

しかし、どういうわけかコードを切り離さないと、間違いなくメンテナンスの問題が発生します。

于 2012-12-16T06:08:16.827 に答える
0

「テスト」クラスはどこから来たのですか?Form1内で作成されたと仮定します。Form1の参照を作成中に、Testに渡すことができます。例えば:

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


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

次に、テスト内からフォームにアクセスできます。

于 2012-12-16T05:55:34.520 に答える