C# 使其他类可以访问方法和控件

C# 使其他类可以访问方法和控件,c#,winforms,static,treeview,C#,Winforms,Static,Treeview,我有我的表格1和表格2 MyForm1有一个方法,该方法访问一个向其TreeView添加节点的方法: private void AddNode(TreeNode node) { treeView1.Nodes.Add(node); } 我想从我的表单2中访问此方法,但我有点拘泥于以下事实: 静态AddNode方法需要静态TreeView,这是一种不好的做法 Form1内部的Form2的新实例将创建不同的treeView1实例,这不是我想要的 另外,treeView1是在设计器中声明的,

我有我的
表格1
表格2

My
Form1
有一个方法,该方法访问一个向其
TreeView
添加节点的方法:

private void AddNode(TreeNode node)
{
  treeView1.Nodes.Add(node);
}
我想从我的
表单2
中访问此方法,但我有点拘泥于以下事实:

  • 静态AddNode方法需要静态TreeView,这是一种不好的做法
  • Form1
    内部的
    Form2
    的新实例将创建不同的
    treeView1
    实例,这不是我想要的
另外,
treeView1
是在设计器中声明的,因此我无法将它的修饰符更改为static(有人告诉我,在表单中放置静态控件不是一个好主意)


知道我该怎么做吗?

下面是一些需要将引用存储在某处的选项。这可能不是这种情况下的最佳选择(也可能取决于你的情况),但也有其他的选择,所以请选择


一种解决方案是,只需对要使用的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();

下面是一些需要将引用存储在某处的选项。这可能不是这种情况下的最佳选择(也可能取决于你的情况),但也有其他的选择,所以请选择


一种解决方案是,只需对要使用的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();

声明一个接口并向form2传递对实现该接口的东西的引用

例如:


声明一个接口并向form2传递对实现该接口的东西的引用

例如:


我认为最好的选择是在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);
}
表格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
事件。您可以从“应用程序打开的表单”集合中获取表单2您可以在表单之间共享一些公共对象:

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);
    }
}
公共类模型
{
public event Action DataAdded;//以表单1订阅此事件
public void AddData(string data)//在form2中调用此方法
{
if(DataAdded!=null)
添加数据(数据);
}
}

在best world中,我创建了一个模型,它将包含所有数据,并在
Form1

上反映模型状态。我认为最好的选择是在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);
}
表格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
事件。您可以从“应用程序打开的表单”集合中获取表单2您可以在表单之间共享一些公共对象:

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);
    }
}
公共类模型
{
public event Action DataAdded;//以表单1订阅此事件
public void AddData(string data)//在form2中调用此方法
{
if(DataAdded!=null)
添加数据(数据);
}
}

好吧,在best world中,我创建了一个模型,它将包含所有数据,并在
Form1

上反映模型状态,使表单能够相互访问

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


我能想到的最好的方法是,如果这种行为是你将来会遇到的,那就是有一个注入到所有形式中的基本方法,通过它,你可以让消息从一个传递到另一个,而不需要紧密耦合。这样,您可以让Form1订阅Form2触发的事件,当该事件触发时,您可以添加节点。

使表单能够相互访问

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


我能想到的最好的方法是,如果这种行为是你将来会遇到的,那就是有一个注入到所有形式中的基本方法,通过它,你可以让消息从一个传递到另一个,而不需要紧密耦合。这样,您就可以让Form1订阅Form2触发的事件,当该事件触发时,您将添加节点。

为什么不简单地将AddNode声明为public(非静态)并将Form1的引用传递给Form2?例如,使用Form1类型的公共属性。Form1是主窗体吗?你从Form1开始创建Form2吗?@lazyberezovsky不,它们都是从另外两种形式创建的。我也打算将treeview作为参数传递给form2构造函数,但它在那个时候不可见,为什么不简单地将AddNode声明为public(非静态)并将Form1的引用传递给form2呢?例如,使用Form1类型的公共属性。Form1是主窗体吗?你是从表格一开始写表格二吗