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是主窗体吗?你是从表格一开始写表格二吗