c#将控制引用传递给另一个表单

本文关键字:另一个 表单 控制 引用 | 更新日期: 2023-09-27 17:54:29

我有一个按钮和隐藏的文本框在我的主要形式。当我按下按钮时,它将隐藏主表单并显示第二个表单。当我按下第二个表单上的按钮时,我想再次显示主表单,但这次我需要显示隐藏的文本框。我知道如何从文本框传递文本到另一种形式,而不仅仅是文本框的引用。

c#将控制引用传递给另一个表单

您最好为第二个表单传递完整的主表单实例,并创建一个公共函数来将文本框设置为可见,或者在它周围创建一个属性。比如:

//form1
Form2 second = new Form2(this);
}....
public void ShowTextBox()
{
    textbox1.Visible=true;
}
//form2
Form parent;
public Form2(Form _parent)
{
    parent=_parent;
}
///later
parent.Show();
parent.ShowTextBox();

听起来像自定义事件将是一个更好的方法。让二级表单公开一个事件,该事件将在任何适当的时间(按下按钮)引发。在主表单中,当创建第二个表单的实例时,订阅该事件。然后在mainform的事件订阅中运行"取消隐藏"代码。

这保持了两种形式的耦合,并产生了更容易维护和可扩展的代码(为了获得最佳效果,使用接口,但事件是学习的一个很好的中间场所)。

像这样:(我已经很长时间没有使用winforms,甚至事件,所以如果需要改进,请告诉我)

// your secondary/popup form's class
public partial class Form2 : Form 
{
    // add a custom event
    public EventHandler<EventArgs> MyCustomEvent;
    // link up your button click event
    void InitializeComponent() {
        myButton.Click += myButtonClick;
    }
    // when your button is clicked, raise your custom event
    void myButtonClick(object sender, EventArgs, e) {
        onMyCustomEvent();
    }
    // this "broadcasts" the event
    void onMyCustomEvent() {
        EventHandler<EventArgs> h = MyCustomEvent;
        if (h != null) {
            h(this, new EventArgs());
        }
    }
}

// your main form's class
public partial class MainForm
{
    void InitializeComponent() {
        // ...
    }
    void showForm2() {
        var form2 = new Form2();
        form2.MyCustomEvent += form2CustomEvent;
        form2.Show();
    }
    void form2CustomEvent(object sender, EventArgs e) {
        myHiddenTextBox.Visible = true;
    }
}

总的来说,就代码架构而言,这是一种更好的方法。现在弹出窗口不关心谁打开它(它没有参考的主要形式),和自定义事件(这是你真正想要的)可以管理到任何级别的控制,你需要,而不干扰其他事情如何工作(例如,也许以后你可能想要有一个不同的动作,触发这个相同的自定义事件…)

发人深省