【问题标题】:Show second form instead of first form when winforms loaded in C#在 C# 中加载 winforms 时显示第二种形式而不是第一种形式
【发布时间】:2015-07-23 08:34:26
【问题描述】:

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

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

【问题讨论】:

  • 您想加载一个表单,只是为了立即隐藏它并显示另一个表单?为什么?只需在 Main 方法中执行 Application.Run(new LoginForm()); 后跟 Application.Run(new MainForm()); 即可。
  • 另外,加载事件在显示表单之前发生。试图在显示之前隐藏某些东西是没有用的。你肯定想要一个模态登录,所以至少调用 ShowModal 而不是 Show。
  • 只需使用 ShowDialog() 代替。并注意其返回值。并且不要将您自己的不安全登录程序置于 Windows 提供的安全登录程序之上,您不是在与 Internet 上的陌生人交谈。

标签: c# forms winforms


【解决方案1】:

我们这里有以下问题:

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

  2. 1234563 .

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

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

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;
}

【讨论】:

  • 对于第一种解决方法,我得到一个错误:“跨线程操作无效:控制 'Form1' 从创建它的线程以外的线程访问。”在这个.Hide();第二个解决方案效果很好。但我只是好奇使用 Load 事件和 Paint 事件有什么区别?
【解决方案2】:

从您提到的代码中,我了解到您正在尝试关闭登录表单并尝试打开主表单。你可以试试这段代码。此代码将进入您的 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());
    }
}

在你的表单1中声明一个公共变量

public bool Authentication_success= true;

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

Authentication_success= true;
this.Close();

希望此解决方案对您有所帮助。祝你好运。

【讨论】:

    【解决方案3】:

    另一种解决方案:

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

    但我认为根据您的问题在 cmets 中遵循建议更好:)

    【讨论】:

    • 我的问题下方的解决方案(cmets)不是我想要的。当我的条件为真时,我希望我的第二个表格显示。因此,如果我直接在 program.cs 中进行更改,那么我不能使用任何条件来检查它,第二种形式应该显示或不应该显示。无论如何,您的解决方案也很有效。谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多