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

标签 c# winforms static treeview

我有我的 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/

相关文章:

c# - 绑定(bind)到 CosmosDB 输入时需要“Id”

javascript - 如何将变量传递给 asp.net 中的外部 JS 文件?

c# - 将 WindowState 设置为最大化会导致窗口出现得太早

php - 可以将大多数静态 PHP 类在其自身内部实例化为 'okay' 实践吗?

c# - 在 C# 2.0 中使用委托(delegate)结果作为输入

c# - 使用不允许小数的正则表达式检查文本框

c# - 使 WinForm 更改背景颜色但仍可用

从另一个类调用方法后,C# 设置 Form Parent

java - 为什么java接口(interface)不能包含静态方法实现?

c# - 从 html 单选按钮获取值 - 在 aspx-c#