【问题标题】:Hide Form1, show Form2 on Form1_Load隐藏 Form1,在 Form1_Load 上显示 Form2
【发布时间】:2016-09-05 19:13:55
【问题描述】:

我的应用程序的 Form1 是我想要的登录页面:
- 在某些条件下显示
- 在某些情况下隐藏和显示 Form2

我可以像这样通过按钮单击事件隐藏/显示表单,

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 f2= new Form2();
        f2.Show();
        this.Hide();
    }

但同样的技术不适用于 Form1_Load。

我已经尝试过this thread中的第一个例子,

Program.cs

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

Form1

    private void Form1_Load(object sender, EventArgs e)
    {

        Form2 f2= new Form2();
        f2.Show();
        this.Hide();
    }

但它既没有显示 Form1 也没有显示 Form2,我不明白它是怎么做到的。第二个例子我看不懂怎么实现,接下来google的结果就更混乱了。
请帮助我坚持了 2 个小时。

【问题讨论】:

  • 应该是:program.cs中的Application.Run(new Form1());
  • 这是默认方式。但是在 Form1_Load 上执行 this.Hide() 并不会隐藏 Form1。
  • 你的程序需要创建和加载Form1。违约与否;你在某处需要new Form1ShowApplication.Run 通常以正确的方式处理此问题。另一种方法是在您的主函数中创建一个Form1。注意.Show 是一个非阻塞调用,如果你不处理它,你的应用程序将会退出。

标签: c# winforms


【解决方案1】:

在 program.cs 的最后一行中,您必须在括号之间输入new Form1()。所以,你的 program.cs 代码如下:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

显然,C# 不能在 form_load evant 中隐藏表单。 要解决隐藏问题,您可以使用计时器并在刻度事件中隐藏表单。即:

Timer timer = new Timer();

private void timerTick(object sender, EventArgs e)
{
    timer.Enabled = false;
    this.Hide();
}

private void Form1_Load(object sender, EventArgs e)
{
   timer.Tick += new EventHandler(timerTick);
   timer.Interval = 10;
   Form2 frm = new Form2();
   frm.Show();
   timer.Enabled = true;
 }

这行得通。我测试过了。

我希望这会有用。

【讨论】:

  • 我知道你在说什么,但这并不能解决我的问题。
  • @Cris:由于它可能无法立即解决您的问题,因此也需要解决此问题。
  • 我实施了您的解决方案。谢谢!
【解决方案2】:

你好,你可以使用这个

private void button1_Click(object sender, EventArgs e)
{
    Form2 f2= new Form2();
    if(condition==true)
    {
        this.Hide();
        f2.ShowDialog();
        this.Close();
    }
}

【讨论】:

  • 我喜欢这种方法,谢谢!我确实做了一个改变。我将上面的代码放在 Form1_Shown 事件中,因为我不想在我的情况下单击按钮。
【解决方案3】:

为什么不颠倒表单的顺序?从 main 方法中的主窗体开始。

Application.Run(new Form2());

现在在 Form2 的构造函数中使用 ShowDialog 调用登录表单,并将登录结果设置在 Form2 内部的全局变量中

public class Form2:Form
{
     private bool _isValidated = false;
     public Form2()
     {
         InitializeComponent();

         // Add here the conditions to check if you don't want to 
         // run the login process...
         // if(loginNotRequired) 
         //    _isValidated = true;
         // else 

         using(Form1 fLogin = new Form1())
         {
             // This blocks until the user clicks cancel or ok buttons
             DialogResult dr = fLogin.ShowDialog();
             if(dr == DialogResult.OK)
                _isValidated  = true;
         }
     }

现在在 Form2.Load 事件中检查您的登录状态,如果登录不成功则关闭 Form2

    private void Form2_Load(object sender, EventArgs args)
    {
         if(!_isValidated)
            this.Close();
         else
            .....
    }

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多