我有我的 Form1
和我的 Form2
。
我的 Form1
有一个方法可以访问将节点添加到它的 TreeView
的方法:
private void AddNode(TreeNode node)
{
treeView1.Nodes.Add(node);
}
我想从我的 Form2
访问这个方法,但我有点卡在了
- 静态 AddNode 方法需要静态 treeView1,这是一种不好的做法。
Form1
内的Form2
的新实例将创建一个不同的treeView1
实例,这不是我想要的。
此外,treeView1
是在设计器中声明的,所以我不能真正将它的修饰符更改为静态(有人告诉我,将静态控件放在表单中不是一个好主意)。
知道我该怎么做吗?
最佳答案
我认为最好的选择是在 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
事件。您可以从应用程序打开的表单集合中获取 form2。 或者您可以在表单之间共享一些公共(public)对象:
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
上反射(reflect)该模型状态。
关于c# - 使其他类可以访问方法和控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13843261/