我的主表单上有一个按钮和隐藏的文本框。当我按下按钮时,它将隐藏主窗体并显示第二个窗体。当我按下第二个表单上的按钮时,我想再次显示主表单,但这次我需要显示隐藏的文本框。我知道如何将文本从文本框传递到另一个表单,但不仅仅是文本框的引用。
答案 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;
}
}
就代码架构而言,总而言之,这是一种更好的方法。现在弹出窗口并不关心是谁打开它(它没有引用主窗体),自定义事件(这就是你真正想要的)可以被管理到你需要的任何控制级别,而不会干扰其他方式事情工作(例如,也许以后你可能想要一个不同的动作来激发同一个自定义事件...)
深思熟虑。