1

私は私Form1と私のを持っていForm2ます。
Form1には、ノードを追加するメソッドにアクセスするメソッドがありますTreeView

private void AddNode(TreeNode node)
{
  treeView1.Nodes.Add(node);
}

私は自分からこのメソッドにアクセスしたいのですForm2が、

  • 静的なAddNodeメソッドには静的なtreeView1が必要ですが、これは一種の悪い習慣です。
  • Form2内部の新しいインスタンスは、私が望むものではないForm1別のインスタンスを作成しますtreeView1

また、treeView1はデザイナ内で宣言されているため、修飾子を静的に変更することはできません(静的コントロールをフォーム内に配置するのは得策ではないと言われています)。

私がこれをどのように行うことができるかについてのアイデアはありますか?

4

4 に答える 4

3

最良のオプションは、Form2でイベントを作成し、Form1でそのイベントをサブスクライブすることだと思います。Form2で何かを行うとき(たとえば、ユーザーがボタンをクリックするとき)、そのイベントを発生させます(イベント引数としていくつかのパラメーターを渡すこともできます)。

フォーム1:

private void StartForm2Button_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.SomethingHappened += Form2_SomethingHappened;
    form2.Show();
}

private Form2_SomethingHappened(object sender, EventArgs e)
{
    Form2 form2 = (Form2)sender;
    string data = form2.Data;
    // create node
    AddNode(node);
}

Form2:

public event EventHandler SomethingHappened;

public string Data
{
   get { return textBoxData.Text; }
}

private void SomeButton_Click(object sender, EventArgs e)
{
    if (SomethingHappened != null)
        SomethingHappened(this, EventArgs.Empty);
}

したがって、他の2つの異なるフォームから作成されたフォームを更新Form2すると、イベントをサブスクライブするための別の方法が必要になります。form2は、アプリケーションで開いたフォームコレクションから取得できます。または、フォーム間でいくつかの共通オブジェクトを共有できます。

public class Model
{
    public event Action<string> DataAdded; // subscribe to this event in form1

    public void AddData(string data) // call this method in form2
    {
        if (DataAdded != null)
            DataAdded(data);
    }
}

さて、最高の世界では、すべてのデータを含むモデルを作成し、そのモデルの状態をに反映しましたForm1

于 2012-12-12T15:48:47.090 に答える
1

以下は、参照をどこかに保存する必要があるいくつかのオプションです。これは状況に最適なオプションではない場合があります(または状況によっては異なる場合があります)が、他の選択肢も掲載されているので、選択してください。


1つの解決策は、使用するForm1インスタンスへの静的参照を作成することです。

static Form1 OpenForm1 = new Form1();

//in some other code
OpenForm1.MyFunction();

他にも多くの方法がありますが、重要な点は、Form2インスタンスが何らかの方法でForm1インスタンスへの参照を持っていることを確認する必要があるということです。


別のオプションとして、Form2を作成するときにインスタンスを渡すことができます。

たとえばプロパティとして...

//create Form2 from some where else
Form2 form2 = new Form2();
form2.ReferenceToForm1 = form1;

//in form2
public Form1 ReferenceToForm1 {get;set;}

//when needed in form2
ReferenceToForm1.MyFunction();
于 2012-12-12T15:41:53.740 に答える
0

インターフェイスを宣言し、form2にインターフェイスを実装するものへの参照を渡します。

例えば:

public interface INodeAddable {
   void AddNode(TreeNode node);
}

public class Form1 : INodeAddable
{
    private void SomeMethod()
    {
        var f2 = new Form2(this);
    }

    public void AddNode(TreeNode n)
    {
       // add node to tree
    }
}

public class Form2
{
  private INodeAddable x;
  public Form2(INodeAddable x)
  {
    this.x = x;
  }

  public void SomeEventHandler(object sender, EventArgs e)
  {
     x.AddNode(someNewNode);
  }
}
于 2012-12-12T15:44:47.903 に答える
0

フォームが相互にアクセスできるようにします。

それらはさまざまな形から生成されるとあなたが言ったので、1つのアプローチは、共通のルートにそれらの存在についての知識を持たせ、それらの共通の祖先からの接続を確立することです。

私が考えることができる最善のアプローチは、この種の動作が将来遭遇するものである場合、すべてのフォームに注入される基本的なEventAggregatorを用意することです。これにより、メッセージをしっかりと持たなくても、メッセージを相互に渡すことができます。結合。これにより、Form1でForm2がトリガーするイベントをサブスクライブし、そのイベントがトリガーされたときにノードを追加できます。

于 2012-12-12T15:51:59.770 に答える