Скрытие формы и отображение другой при нажатии кнопки в приложении Windows Forms - PullRequest
6 голосов
/ 03 декабря 2010

Я делаю приложение в приложении Windows Form. Сначала появляется определенная форма, и после того, как пользователь нажимает следующую кнопку, эта форма должна быть скрыта, и отображается другая форма.

Я пытался это сделать. Мне удалось скрыть текущую форму, но следующая не будет отображаться.

Вот моя попытка:

Это обработчик события кнопки

private void button1_Click_1(object sender, EventArgs e)
{
    if (richTextBox1.Text != null)
    {
        this.Visible=false;


    }
    else
        MessageBox.Show("Insert Attributes First !");
}

Это основная функция:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form2 form2 = new Form2();
    Form1 form1 = new Form1();
    form2.Hide();
    Application.Run(form1);
    while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }
}

Ответы [ 6 ]

5 голосов
/ 03 декабря 2010

Оператор While не будет выполняться до тех пор, пока форма form1 не будет закрыта, поскольку она находится вне основного цикла сообщений.

Удалите его и измените первый бит кода на:

private void button1_Click_1(object sender, EventArgs e)  
{  
    if (richTextBox1.Text != null)  
    {  
        this.Visible=false;
        Form2 form2 = new Form2();
        form2.show();
    }  
    else MessageBox.Show("Insert Attributes First !");  

}

Это не лучший способ достичь того, что вы хотите сделать.Вместо этого рассмотрим шаблон проектирования Wizard .

В качестве альтернативы вы можете реализовать пользовательский ApplicationContext, который обрабатывает время жизни обеих форм.Вот пример реализации заставки, которая должна указать правильный путь.

http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx?display=Print

2 голосов
/ 10 августа 2015

Для ссылки на форму вам нужно:

Form2 form2 = new Form2();
        form2.show();

this.hide();

, а затем скрыть предыдущую форму

2 голосов
/ 16 октября 2012
private void button5_Click(object sender, EventArgs e)
{
    this.Visible = false;
    Form2 login = new Form2();
    login.ShowDialog();
}
2 голосов
/ 03 декабря 2010

A) Основной поток GUI будет бесконечно работать при вызове Application.Run, поэтому ваш цикл while никогда не будет достигнут

B) Вы никогда не захотите иметь такой бесконечный цикл (while(истинный) цикл) - это просто заморозит поток.Не совсем уверен, чего вы там добиваетесь.

Я бы создал и показал "основную" (начальную) форму в методе Main (как Visual Studio делает для вас по умолчанию).Затем в обработчике кнопок создайте другую форму и покажите ее, а также скрыв основную форму (не закрывая ее).Затем убедитесь, что основная форма отображается снова, когда эта форма закрыта через событие.Пример:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }    

  private void button1_Click(object sender, EventArgs e)
  {      
    Form2 otherForm = new Form2();
    otherForm.FormClosed += new FormClosedEventHandler(otherForm_FormClosed);
    this.Hide();
    otherForm.Show();      
  }

  void otherForm_FormClosed(object sender, FormClosedEventArgs e)
  {
    this.Show();      
  }
}
2 голосов
/ 03 декабря 2010

Все, что после Application.Run () будет выполняться только при закрытии основной формы.

Что вы можете сделать, это обработать событие VisibleChanged следующим образом:

static Form1 form1;
static Form2 form2;

static void Main()
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    form2 = new Form2();
    form1 = new Form1();
    form2.Hide();
    form1.VisibleChanged += OnForm1Changed;
    Application.Run(form1);

}

static void OnForm1Changed( object sender, EventArgs args )
{
    if ( !form1.Visible )
    {
        form2.Show( );
    }
}
0 голосов
/ 03 декабря 2010

Я полагаю, что следующий код будет запускаться только после закрытия form1

 while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }

Почему бы не начать вместо form1 *1008*? 1009 *

Form2 form2 = new Form2();
 private void button1_Click_1(object sender, EventArgs e)
    {
        if (richTextBox1.Text != null)
        {
            form1.Visible=false;
            form2.Show();

        }
        else MessageBox.Show("Insert Attributes First !");

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...