【问题标题】:Making instances of forms public C#将表单实例设为公共 C#
【发布时间】:2013-05-19 23:42:26
【问题描述】:

我正在尝试将信息从子窗体传递给父窗体。我一直在使用我在论坛上找到的以下代码来帮助我:

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childform
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 tempDialog = new Form2(this);
        tempDialog.ShowDialog();
    }

    public void msgme()
    {
        MessageBox.Show("Parent Function Called");
    }

}
}

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace childform
{
public partial class Form2 : Form
{
    private Form1 m_parent;

    public Form2(Form1 frm1)
    {
        InitializeComponent();
        m_parent = frm1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        m_parent.msgme();
    }
}
}

效果很好,一切都很好。麻烦的是,我的程序要求我在 tempDialog 中设置变量,从 Form 1,在 button1_Click 以外的方法中。但是,这些找不到 tempDialog 的实例,因为它在 button1_click 中。

另外,我不能将它移出方法(例如,移入类),因为“this”修饰符不引用 Form1...

有什么想法可以从 Form2 引用 Form1,反之亦然?使用此代码还是其他方式?

谢谢

【问题讨论】:

    标签: c# wpf winforms function public


    【解决方案1】:

    我不确定你对this 的最后评论是什么意思。创建一个引用Form2 的字段并在构造函数中对其进行初始化。然后可以在Form1的其他方法中引用_form2

    public partial class Form1 : Form
    {
        private Form2 _form2;
        public Form1()
        {
            InitializeComponent();
            _form2 = new Form2(this);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            _form2.ShowDialog();
        }
    
    }
    

    当复杂性增加时,这种事情会变得难以理解。更好的方法可能是让 Form1Form2 引用一些它们都可以操作的公共对象。

    【讨论】:

    • 谢谢你,完美!我不太明白你所说的变得难以理解是什么意思,但我相信当我打破某些东西时我会解决的!
    【解决方案2】:

    您可以尝试研究 Form 对象上的 MdiParent 和 Parent 属性。这些允许您获取和设置父级并在需要时访问它们的方法。

    有关详细信息,请参阅 MSDN 上的 Parent propertyMdiParent property

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      根据您的应用程序,如果您在应用程序中显示和隐藏的表单只有一个副本,您可能只能创建一个单例静态引用。这仅在您只实例化一次表单然后在其上使用show()/hide() 使其消失或根据需要重新出现时才有效。

      public partial class Form2 : Form
      {
          public static Form2 Instance;
      
          public Form2()
          {
              InitializeComponent();
              this.Instance = this;
          }
      }
      

      然后您可以使用代码从任何地方访问表单 2:

      Form2.Instance.xxx
      

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多