C#将控件引用传递给另一个表单

时间:2016-07-02 00:57:27

标签: c# winforms

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

2 个答案:

答案 0 :(得分:1)

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

//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();

答案 1 :(得分:1)

听起来像一个自定义事件将是一个更好的方法。让辅助表单公开一个事件,该事件在任何适当的时间(按下按钮)引发。在主表单中,当您创建第二个表单的实例时,请订阅该事件。然后在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;
    }

}

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

深思熟虑。