Например, предположим, что я в форме 1, тогда я хочу:
- Открыть форму 2 (от кнопки в форме 1)
- Закрыть форму 1
- Фокус на форме 2
Например, предположим, что я в форме 1, тогда я хочу:
Решение Steve не работает. При вызове this.Close() текущая форма расположена вместе с формой2. Поэтому вам нужно скрыть его и установить form2.Closed event, чтобы вызвать this.Close().
private void OnButton1Click(object sender, EventArgs e)
{
this.Hide();
var form2 = new Form2();
form2.Closed += (s, args) => this.Close();
form2.Show();
}
Попробуйте сделать это...
{
this.Hide();
Form1 sistema = new Form1();
sistema.ShowDialog();
this.Close();
}
Проблема существа с этой строкой:
Application.Run(new Form1());
Скорее всего, это можно найти в файле program.cs.
Эта строка указывает, что form1 обрабатывает цикл сообщений - другими словами, form1 несет ответственность за выполнение вашего приложения - приложение будет закрыто, когда form1 будет закрыт.
Есть несколько способов справиться с этим, но все они так или иначе не закрывают form1.
(Если мы не сменим тип проекта на нечто иное, чем приложение форм Windows)
То, что я считаю самым легким в вашей ситуации, - это создать 3 формы:
form1 - останется невидимым и будет действовать как менеджер, вы можете назначить его для обработки значка в трее, если хотите.
form2 - будет кнопка, которая при нажатии закрывает форму2 и откроет form3
form3 - будет играть роль другой формы, которая должна быть открыта.
И вот пример кода для этого:
(Я также добавил пример, чтобы закрыть приложение из третьей формы)
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); //set the only message pump to form1.
}
}
public partial class Form1 : Form
{
public static Form1 Form1Instance;
public Form1()
{
//Everyone eveywhere in the app should know me as Form1.Form1Instance
Form1Instance = this;
//Make sure I am kept hidden
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
Visible = false;
InitializeComponent();
//Open a managed form - the one the user sees..
var form2 = new Form2();
form2.Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var form3 = new Form3(); //create an instance of form 3
Hide(); //hide me (form2)
form3.Show(); //show form3
Close(); //close me (form2), since form1 is the message loop - no problem.
}
}
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1.Form1Instance.Close(); //the user want to exit the app - let close form1.
}
}
Примечание. Работа с панелями или загрузка пользовательских элементов управления динамически более академичны и предпочтительнее, чем промышленные стандарты производства. Но мне кажется, что вы просто пытаетесь понять, как все работает - для этого этот пример лучше.
И теперь, когда принципы понятны, попробуйте сделать это двумя способами:
Первая форма займет роль менеджера, как и в предыдущем примере, но также представит первый экран - поэтому он не будет закрыт только скрытым.
Вторая форма возьмет на себя роль показа следующего экрана и нажатием кнопки закроет приложение.
public partial class Form1 : Form
{
public static Form1 Form1Instance;
public Form1()
{
//Everyone eveywhere in the app show know me as Form1.Form1Instance
Form1Instance = this;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Make sure I am kept hidden
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
Visible = false;
//Open another form
var form2 = new Form2
{
//since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
TopMost = true
};
form2.Show();
//now that that it is topmost and shown - we want to set its behavior to be normal window again.
form2.TopMost = false;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1.Form1Instance.Close();
}
}
Если вы изменили предыдущий пример - удалите form3 из проекта.
Удачи.
Вы не были конкретны, но похоже, что вы пытались сделать то, что я делаю в своих приложениях Win Forms: начните с формы входа, затем после успешного входа в систему закройте эту форму и сосредоточьтесь на основной форме. Вот как я это делаю:
make frmMain форма запуска; это то, что выглядит моя Program.cs:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
в моем frmLogin, создайте общедоступное свойство, которое инициализируется в false и устанавливается в true, только если успешный вход в систему:
public bool IsLoggedIn { get; set; }
my frmMain выглядит так:
private void frmMain_Load(object sender, EventArgs e)
{
frmLogin frm = new frmLogin();
frm.IsLoggedIn = false;
frm.ShowDialog();
if (!frm.IsLoggedIn)
{
this.Close();
Application.Exit();
return;
}
Не удалось войти в систему? Выйдите из приложения. В противном случае продолжайте работу с frmMain. Поскольку это форма запуска, когда она закрывается, приложение заканчивается.
private void buttonNextForm(object sender, EventArgs e)
{
NextForm nf = new NextForm();//Object of the form that you want to open
this.hide();//Hide cirrent form.
nf.ShowModel();//Display the next form window
this.Close();//While closing the NextForm, control will come again and will close this form as well
}
используйте этот фрагмент кода в вашей форме1.
public static void ThreadProc()
{
Application.Run(new Form());
}
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
t.Start();
this.Close();
}
Я получил это от здесь
Я думаю, это намного проще:)
private void btnLogin_Click(object sender, EventArgs e)
{
//this.Hide();
//var mm = new MainMenu();
//mm.FormClosed += (s, args) => this.Close();
//mm.Show();
this.Hide();
MainMenu mm = new MainMenu();
mm.Show();
}
Многие другие способы уже описаны другими ответами. Однако многие из них либо участвуют ShowDialog()
, либо form1
остаются открытыми, но скрытыми. На мой взгляд, лучший и самый интуитивный способ - просто закрыть form1
, а затем создать form2
из внешнего местоположения (т.е. Не из одной из этих форм). В случае, когда form1
был создан в Main
, form2
можно просто создать с помощью Application.Run
, как раньше, как form1
. Вот пример сценария:
Мне нужно, чтобы пользователь вводил свои учетные данные, чтобы я каким-то образом их аутентифицировал. Впоследствии, если аутентификация прошла успешно, я хочу показать основное приложение пользователю. Для этого я использую две формы: LogingForm
и MainForm
. LoginForm
имеет флаг, определяющий, была ли аутентификация успешной или нет. Этот флаг затем используется для принятия решения о создании экземпляра MainForm
или нет. Ни одна из этих форм не должна знать о другом, и обе формы могут быть открыты и закрыты изящно. Вот код для этого:
class LoginForm : Form
{
bool UserSuccessfullyAuthenticated { get; private set; }
void LoginButton_Click(object s, EventArgs e)
{
if(AuthenticateUser(/* ... */))
{
UserSuccessfullyAuthenticated = true;
Close();
}
}
}
static class Program
{
[STAThread]
static void Main()
{
LoginForm loginForm = new LoginForm();
Application.Run(loginForm);
if(loginForm.UserSuccessfullyAuthenticated)
{
// MainForm is defined elsewhere
Application.Run(new MainForm());
}
}
}
Предположим, у вас есть две формы, первое имя формы - Form1, а второе имя формы - Form2.Вы должны перейти от Form1 к Form2, введите здесь код. Напишите код следующим образом:
В Form1 у меня есть одна кнопка с именем Button1, а на ее клике выберите код ниже:
protected void Button1_Click(Object sender,EventArgs e)
{
Form frm=new Form2();// I have created object of Form2
frm.Show();
this.Visible=false;
this.Hide();
this.Close();
this.Dispose();
}
Надеюсь, что этот код поможет вам
//if Form1 is old form and Form2 is the current form which we want to open, then
{
Form2 f2 = new Form1();
this.Hide();// To hide old form i.e Form1
f2.Show();
}
Этот код может помочь вам:
Master frm = new Master();
this.Hide();
frm.ShowDialog();
this.Close();
this.Visible = false;
//or // will make LOgin Form invisivble
//this.Enabled = false;
// or
// this.Hide();
Form1 form1 = new Form1();
form1.ShowDialog();
this.Dispose();
Если у вас есть две формы: frm_form1 и frm_form2. Следующий код используется для открытия frm_form2 и закрытия frm_form1. (Для приложения формы Windows)
this.Hide();//Hide the 'current' form, i.e frm_form1
//show another form ( frm_form2 )
frm_form2 frm = new frm_form2();
frm.ShowDialog();
//Close the form.(frm_form1)
this.Close();
Я бы решил это:
private void button1_Click(object sender, EventArgs e)
{
Form2 m = new Form2();
m.Show();
Form1 f = new Form1();
this.Visible = false;
this.Hide();
}