【问题标题】:Showing a form in c# issue?在 C# 问题中显示表单?
【发布时间】:2015-06-17 05:53:24
【问题描述】:

我有 3 个表格。 frm1frm2frm3。我想从frm1frm2 显示frm3,而不创建它的新实例。只是我想始终显示 frm3 的实际形式而不是它的新实例:

我在 Frm1 中尝试过的示例:

frm3 f3 = new frm3()
f3.showDialog();

在 Frm2 中:

frm3 f3 = new frm3();
f3.showDialog(); 

但我不想像我尝试过的那样显示frm3,我想要实际的表单而不是新的实例?

【问题讨论】:

  • 让你的答案清晰而有意义。
  • 这不是答案,而是评论
  • cmets 也应该是有意义的。
  • 如果您知道解决方案,请将其作为答案提供,那么它将被接受。
  • 您在寻找show/hide optons 吗?

标签: c#


【解决方案1】:

一种方法是将frm3 类型的公共属性添加到frm1frm2

public frm3 Form3 {get; set;}

然后创建frm3 的实例,并在frm1 和frm2 上设置属性,以便它们可以使用相同的实例。

例如在子主目录中

frm1 f1 = new frm1();
frm2 f2 = new frm2();
frm3 f3 = new frm3();

frm1.Form3 = f3;
frm2.Form3 = f3;

那么在frm2和frm1中就可以使用了

this.Form3.ShowDialog();

请注意,您需要注意不要尝试同时从 frm1 和 frm2 操作 frm3 的实例。您可能会遇到错误。

【讨论】:

  • 最好添加到frm1和frm2的构造函数中
  • 这是一个选择,但不一定更好。这取决于您的设计目标/限制是什么。
  • 这实际上取决于哪个表单是父表单,如果 form3 不是父表单,那么这将需要添加对现有表单的引用。但本质上......我同意,最好在基类或接口中设置属性
【解决方案2】:

您可以完全动态地执行此操作,而无需全局变量或其他构造。也不必更改任何当前的表单代码。

public void CreateOrActivateForm<T>() where T : Form
{
    IEnumerable<T> openForms = Application.OpenForms.OfType<T>();

    if (openForms.Any())
    {
        foreach (T openForm in openForms)
        {
            openForm.Activate();
        }
    }
    else
    {
        Form form = (T)Activator.CreateInstance(typeof(T));

        form.Show();
    }
}

public void OpenForm2()
{
    CreateOrActivateForm<Form2>();
}

将它放在“Helper”类中,您可以激活打开的表单或创建新表单。

如果你只想得到'Form2':

Form2 form2 = Application.OpenForms.OfType<Form2>().Cast<Form2>().FirstOrDefault();

【讨论】:

    【解决方案3】:

    如果您不想每次都显示表单的新实例,您可以在 form1 上有一个全局变量,您可以在 form1 加载时实例化一次,然后显示它(frm2.showdialog ) 需要时。

    【讨论】:

      【解决方案4】:

      使用这些代码行。

      在表单类中添加构造函数和 getter 方法。

      public partial class YourFormClass: Form
      {
          private static YourFormClass mInst;
      
          private YourFormClass()
          {
              InitializeComponent();
          }
      
          public static YourFormClass CheckInst
          {
              get
              {
                  return mInst;
              }
          }
      
          public static YourFormClass CreateInst
          {
              get
              {
                  if (mInst == null)
                      mInst = new YourFormClass();
                  return mInst;
              }
          }
      
          protected override void OnClosed(EventArgs e)
          {
              mInst = null;
              base.OnClosed(e);
          }
      
      }
      

      然后检查表单实例是否已经在使用

      if (YourFormClass.CheckInst == null)
      {
          YourFormClass.CreateInst.Show();
          YourFormClass.CreateInst.MdiParent = this;
      }
      else
      {
          YourFormClass.CreateInst.WindowState = FormWindowState.Normal;
          YourFormClass.CreateInst.Focus();
      }
      

      检查一次。

      【讨论】:

        【解决方案5】:

        把它放在一个全局变量中试试这个,

        public partial class Form1 : Form
        {
            public Form1() {
                InitializeComponent();
                globalvars.ref_Form1 = this;
            }
        }
        public static class globalvars { public static Form1 ref_Form1; }
        

        现在您可以通过globalvars.ref_Form1 访问它。

        【讨论】:

          猜你喜欢
          • 2015-03-09
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 2023-02-09
          • 1970-01-01
          • 2018-06-13
          • 2014-10-17
          • 2022-01-15
          相关资源
          最近更新 更多