使方法和控件可供其他类访问

时间:2012-12-12 15:39:22

标签: c# winforms static treeview

我有Form1Form2 我的Form1有一个方法可以访问一个向其添加节点的方法TreeView

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

我想从我的Form2访问此方法,但我有点坚持

  • 静态AddNode方法需要一个静态的treeView1,这是一种不好的做法。
  • Form2Form1的新实例会创建treeView1的不同实例,这不是我想要的。

同样treeView1在设计器中声明,所以我无法将它的修饰符改为静态(我被告知在表单中放置静态控件并不是一个好主意。)

任何想法我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

我认为最好的选择是在Form2中创建事件并在Form1中订阅该事件。当您在Form2上执行某些操作(例如,用户单击按钮)时,引发该事件(您也可以将一些参数作为事件参数传递)。

Form1中:

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

窗体2:

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

更新因此您说,从其他两种不同的表单创建的表单,然后您需要一些其他方式来订阅Form2事件。您可以从应用程序打开的表单集合中获取form2。 OR 您可以在表单之间共享一些常见对象:

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上反映了该模型状态。

答案 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();

答案 2 :(得分: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);
  }
}

答案 3 :(得分:0)

使表单能够互相访问。

既然你说它们是以不同的形式产生的,那么一种方法就是让共同的根知道它们的存在并从它们的共同祖先那里建立联系。

我能想到的最佳方法,如果将来遇到这种行为,就会有一个基本的EventAggregator被注入到所有表单中,并且通过它可以传递消息彼此之间没有紧密耦合。有了这个,您可以让Form1订阅一个Form2触发的事件,当触发该事件时,您将添加该节点。