C# 从子窗体调用函数会导致父窗体重复
在我的应用程序中,我有一个父窗体和一个弹出窗体。在我点击按钮1时弹出的表单中,应用程序应该调用一个函数,作为函数的结果,标签必须更改其文本。虽然弹出按钮可以工作,但我有两个父窗体;一个标签处于默认状态,另一个由于单击弹出窗口中的按钮而更改标签。有没有办法隐藏初始父窗体?以下是我在弹出窗体中使用的代码:C# 从子窗体调用函数会导致父窗体重复,c#,forms,parent-child,C#,Forms,Parent Child,在我的应用程序中,我有一个父窗体和一个弹出窗体。在我点击按钮1时弹出的表单中,应用程序应该调用一个函数,作为函数的结果,标签必须更改其文本。虽然弹出按钮可以工作,但我有两个父窗体;一个标签处于默认状态,另一个由于单击弹出窗口中的按钮而更改标签。有没有办法隐藏初始父窗体?以下是我在弹出窗体中使用的代码: public Form1 f1 = new Form1(); private void button1_Click(object sender, EventArgs e) {
public Form1 f1 = new Form1();
private void button1_Click(object sender, EventArgs e)
{
f1.referansyaz = true;
f1.Show();
}
var popupForm = new PopupForm(this);
popupForm.ShowDialog();
因此,当我将变量“refereansyaz”更改为true时,我调用了表单1中的函数,该函数的结果是表单1(或父表单)中的标签发生了更改。和f1.show()打开更新后的表单1。是否尝试使用以下方法隐藏它:
this.Hide();
以下是对我有效的方法:
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
Form1 f1 = new Form1();
f1.referansyaz = true;
f1.Show();
}
创建
Form1
的第二个实例不是您想要做的事情
修改弹出表单以接受对原始表单的引用:
public class PopupForm : Form
{
private Form1 f1;
public PopupForm(Form1 f1)
{
this.f1 = f1;
}
private void button1_Click(object sender, EventArgs e)
{
f1.referansyaz = true;
Close();
}
// rest of form
...
}
在实例化弹出窗体时传递引用:
public Form1 f1 = new Form1();
private void button1_Click(object sender, EventArgs e)
{
f1.referansyaz = true;
f1.Show();
}
var popupForm = new PopupForm(this);
popupForm.ShowDialog();
通常,我会在子窗体上创建一个公共属性
public class PopupForm : Form
{
public bool Referansyaz { get; private set; }
private void button1_Click(object sender, EventArgs e)
{
Referansyaz = true;
Close();
}
// rest of form
...
}
。。。在关闭子(弹出)窗体后,由父级使用:
var popupForm = new PopupForm();
popupForm.ShowDialog();
referansyaz = popupForm.Referansyaz;
这样,更改父窗体中字段的名称也不会破坏子窗体。您可以这样更改代码,并将更改父窗体上标签的方法(带有委托)传递给第二个窗体。我强烈建议不要将父窗体的实例传递给子窗体,因为它违反了打开-关闭原则 因此,在您的主要表单类型中:
public partial class Form1 : Form
{
public Action<bool> a; `
public Form1()
{
InitializeComponent();
a = new Action<bool>(newValue => this.referansyaz.Text = newValue.ToString());
}
// some code where you create your Form2
Form2 newForm = new Form2(a);
}
公共部分类表单1:表单
{
公共行动a;`
公共表格1()
{
初始化组件();
a=新操作(newValue=>this.refereansyaz.Text=newValue.ToString());
}
//创建表单2的一些代码
Form2 newForm=新Form2(a);
}
然后在第二种形式中:
public partial class Form2 : Form
{
Action<bool> a;
public Form2(Action<bool> a)
{
this.a = a;
}
private void button1_Click(object sender, EventArgs e)
{
a(true);
}
}
公共部分类表单2:表单
{
行动a;
公开表格2(行动a)
{
这个a=a;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
a(正确);
}
}
no它不起作用,因为这个.Hide()隐藏了弹出窗口。它不隐藏初始父窗体。是否在f1.Show()之前调用它?我要隐藏父窗体(也称为form1),此.hide()隐藏弹出窗体(称为form2)。此第二个父窗体是否来自(具有标签的初始值)?你能更具体地告诉我你想要什么吗。。。请检查我对其他问题的回答:“public Form1 f1=new Form1();”此行正在创建父窗体的新实例。正如@GrantWinney所说,您需要将引用传递给您最初的家长表单。我该如何做?你能在答案部分再详细说明一下你的答案吗?我在哪里添加最后两行代码?(即:var popupForm=new popupForm(this);popupForm.ShowDialog();)