it-swarm.com.ru

Скрытие формы и отображение другой при нажатии кнопки в приложении Windows Forms

Я делаю приложение приложение 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();
    }
}
5
Nataly

Оператор 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

5
Martin

Для ссылки на форму вам необходимо: 

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

this.hide();

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

2
user5211787
private void button5_Click(object sender, EventArgs e)
{
    this.Visible = false;
    Form2 login = new Form2();
    login.ShowDialog();
}
2
Arumugam

Что-нибудь после 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( );
    }
}
2
Nick

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

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

Я хотел бы создать и показать «основную» (начальную) форму в методе 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
steinar

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

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

Почему бы не начать свой form2 с form1 вместо этого?

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 !");

    }
0
Bolu