【问题标题】:How to pass an instance of a form to another form如何将表单的实例传递给另一个表单
【发布时间】:2013-01-14 14:54:20
【问题描述】:

我有一个名为form1 的表单,其中包含在运行时创建的控件。

当我按下表单上的按钮时,另一个名为 combatform1 的表单被隐藏,因此只有一个表单 (combat) 可见。

当我按下combat 上的按钮时,我希望显示我的form1 表单。但是我无法访问它。

这是我尝试过的:

 private void combatBtn_Click(object sender, EventArgs e)
    {
        Form combat = new Combat(this);
        this.Hide();
        combat.Show();

    }

public partial class Combat : Form
 {

    public Combat(Form form)
    {
        InitializeComponent();
        form.Show();


    }

    private void button1_Click(object sender, EventArgs e)
    {
        form.Show();
    }
}

【问题讨论】:

  • 通常,您不想这样做。您永远不需要将父表单传递给它的子表单。

标签: c# forms


【解决方案1】:

您需要将父表单存储在一个字段中,以便您可以在构造函数之外访问它。

【讨论】:

    【解决方案2】:
    public partial class Combat : Form
    {
    
        private form1 form;    // Or whatever class you form1 is supposed to be
    
        public Combat(Form form)
        {
            InitializeComponent();
            this.form = form;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            form.Show();
        }
    }
    

    【讨论】:

      【解决方案3】:

      通常不建议将父窗体的实例传递给子窗体。在这种情况下(通常是这样),如果您不这样做,代码实际上会更简单:

      private void combatBtn_Click(object sender, EventArgs e)
      {
          Form combat = new Combat();
          this.Hide();
          combat.ShowDialog();
          this.Show();
      }
      

      如果您需要在子表单关闭之前显示父表单,那么您可以通过事件来实现:

      Combat 添加:

      public event Action MyEvent; //TODO rename to a meaningful name
      

      在按钮点击处理程序中触发事件:

      private void button1_Click(object sender, EventArgs e)
      {
          MyEvent();
      }
      

      然后让你的主窗体为事件添加一个处理程序:

      private void combatBtn_Click(object sender, EventArgs e)
      {
          Combat combat = new Combat();
          this.Hide();
          combat.MyEvent += () => this.Show();
          combat.Show();
      }
      

      【讨论】:

      • 从问题中不清楚以模态方式显示Combat 对话框是他们想要实现的目标。他们显示父母的代码并没有关闭孩子,也不清楚他们想要这样做。
      • @MattBurland 添加了另一个解决方案,如果他需要在子窗体关闭之前显示主窗体。
      • +1,一个很好的解决方案。我同意最好避免传递对表单的引用。最好避免紧耦合。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多