在使用C#

时间:2015-07-23 08:34:26

标签: c# forms winforms

我有两个窗体。我想在第一个表单加载时显示第二个表单。但问题是在加载第一个表单后,它会显示两个表单而不隐藏我的第一个表单。请检查下面的代码。谢谢你的任何解决方案!

 form2 frm2= new form2();
 private void form1_Load(object sender, EventArgs e)
    {
     form1 frm1 = new form1();
     frm1 = this;
     frm1.Hide();
     frm2.Show();  
    }

3 个答案:

答案 0 :(得分:0)

我们在这里遇到以下问题:

  1. 表单加载在之前加载表单。因此,如果我们从这里隐藏表单,它仍然会在Paint事件中绘制它。

  2. 如果我们使用Paint事件来隐藏主窗体并显示我们的第二个窗体,那么当我们需要它时,我们将有问题显示我们的主窗体,因为这会调用paint事件并且它会再次隐藏它

  3. 所以有三种可能的解决方案:

    1. 使用表单加载,但将其从单独的线程中隐藏。
    2. 我们可以创建像isInitialized这样的bool变量设置为false,并在第一次运行Paint事件后将其更改为true
    3. 我们可以看到主窗体可见,并使用ShowDialog()来显示您的第二个窗体
    4. 1 - - >

          private void Form1_Load(object sender, EventArgs e)
          {            
              // We start a new task to handle our UI operations
              Task.Factory.StartNew(() =>
              {
                  this.Hide();
                  this.Invoke(new Action(() =>
                  {
                      Form frm = new Form();
                      frm.Show();
                      frm.FormClosing += (s, o) => this.Show();
                  }), null);                
              });
          }
      

      2 - - >

      bool isInitialized = false;
      
      private void Form1_Paint(object sender, PaintEventArgs e)
      {
         if(isInitialized) return;
         Form frm = new Form();
         frm.Show();
         frm.FormClosing += (s, o) => this.Show();
         this.Hide();
         isInitialized = true;
      }
      

答案 1 :(得分:0)

从您提到的代码中,我了解到您正在尝试关闭登录表单并尝试打开主表单。您可以尝试这段代码。此代码将进入您的Program.cs

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Form1 form_login= new Form1();

    Application.Run(form_login);

    if (form_login.Authentication_success)
    {
        Application.Run(new Form2());
    }
}

在你的form1中声明一个公共变量

public bool Authentication_success= true;

接下来在Form1 Load事件中,添加以下代码

Authentication_success= true;
this.Close();

希望这个解决方案很有帮助。祝你好运。

答案 2 :(得分:0)

另一种解决方案:

    private void Form1_Load(object sender, EventArgs e)
    {
        Task.Factory.StartNew(() =>
        {
            if (InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate
                {
                    this.Hide();
                    Form2 frm = new Form2();
                    frm.Show();
                    frm.FormClosing += (s, o) => this.Show();
                }));
                return;
            }

        });
    }

但我认为根据你的问题在评论中提出以下建议会更好:)