2015-07-23 4 views
1

У меня есть две формы окон. Я хочу показать вторую форму, когда моя первая форма загружена. Но проблема в том, что после загрузки первой формы она показывает обе формы, не скрывая мою первую форму. Пожалуйста, проверьте мой код ниже. Спасибо за любые решения!Показывать вторую форму вместо первой формы, когда winforms загружены в C#

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

Вы хотите загрузить форму, только чтобы скрыть его немедленно и показать другую форму? Зачем? Просто выполните 'Application.Run (new LoginForm());' затем следует 'Application.Run (новый MainForm());' в вашем 'Main' методе. – Luaan

+1

Кроме того, событие загрузки происходит до отображения формы. Пытаться скрыть что-то до того, как оно будет показано, бесполезно. Вы, конечно же, хотите, чтобы модальный логин так назывался ShowModal, а не Show. – Ralf

+0

Просто используйте ShowDialog().И обратите внимание на его возвращаемую стоимость. И не ставьте свою собственную небезопасную процедуру входа поверх защищенной, которую предоставляет Windows, вы не разговариваете с незнакомцем в Интернете. –

ответ

0

Мы имеем следующие проблемы здесь:

  1. Форма загрузки загружает форму перед тем время, когда она написана. Поэтому, если мы скрываем форму отсюда, она все равно рисует ее в событии Paint.

  2. Если мы используем событие Paint, чтобы скрыть основную форму и показать нашу вторую форму, тогда у нас возникнут проблемы с отображением нашей основной формы, когда нам это понадобится, потому что это вызывает событие рисования, и оно снова скроет его.

Таким образом, есть три возможных решения:

  1. Используйте форму загрузки, но скрыть его от отдельного потока.
  2. Мы можем создать переменную Ьоо как isInitialized набор для false и изменить его на true после 1-го запуска в случае Paint
  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; 
} 
+0

Для первого метода решения я получил сообщение об ошибке: «Неверная операция поперечного потока: Control 'Form1' получен из потока, отличного от потока, на котором он был создан." в этом. Hide(); И второе решение хорошо работает. Но я просто интересуюсь, в чем разница между использованием события Load и событием Paint? –

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 добавьте следующий код

Authentication_success= true; 
this.Close(); 

Надежда это решение полезно. Удачи.

+0

Хорошо, thx. Это работает! А также то, что я тоже хочу. –

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

     }); 
    } 

, но я думаю, что следующие предложения в комментариях под ваш вопрос лучше :)

+0

Решение (комментарии) ниже моего вопроса не то, что я хочу. Я хочу, чтобы мое второе шоу показало, когда мое условие истинно. Поэтому, если я непосредственно изменяю в program.cs, тогда я не могу использовать какое-либо условие, чтобы проверить его, чтобы вторая форма отображалась или не отображалась. В любом случае решение ура также хорошо работает. Спасибо :) –

Смежные вопросы