C# 从子窗体调用函数会导致父窗体重复

C# 从子窗体调用函数会导致父窗体重复,c#,forms,parent-child,C#,Forms,Parent Child,在我的应用程序中,我有一个父窗体和一个弹出窗体。在我点击按钮1时弹出的表单中,应用程序应该调用一个函数,作为函数的结果,标签必须更改其文本。虽然弹出按钮可以工作,但我有两个父窗体;一个标签处于默认状态,另一个由于单击弹出窗口中的按钮而更改标签。有没有办法隐藏初始父窗体?以下是我在弹出窗体中使用的代码: public Form1 f1 = new Form1(); private void button1_Click(object sender, EventArgs e) {

在我的应用程序中,我有一个父窗体和一个弹出窗体。在我点击按钮1时弹出的表单中,应用程序应该调用一个函数,作为函数的结果,标签必须更改其文本。虽然弹出按钮可以工作,但我有两个父窗体;一个标签处于默认状态,另一个由于单击弹出窗口中的按钮而更改标签。有没有办法隐藏初始父窗体?以下是我在弹出窗体中使用的代码:

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