例如,假设我在表单1然后我想:
答案 0 :(得分:154)
史蒂夫的解决方案不起作用。调用this.Close()时,当前表单与form2一起处理。因此,您需要隐藏它并设置form2.Closed事件来调用this.Close()。
private void OnButton1Click(object sender, EventArgs e)
{
this.Hide();
var form2 = new Form2();
form2.Closed += (s, args) => this.Close();
form2.Show();
}
答案 1 :(得分:18)
尝试这样做......
{
this.Hide();
Form1 sistema = new Form1();
sistema.ShowDialog();
this.Close();
}
答案 2 :(得分:10)
其他答案已经描述了许多不同的方式。但是,他们中的许多人要么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());
}
}
}
答案 3 :(得分:9)
问题在于那条线:
Application.Run(new Form1());
这可能在program.cs文件中找到。
此行表示form1用于处理消息循环 - 换句话说,form1负责继续执行您的应用程序 - 当form1关闭时,应用程序将被关闭。
有几种方法可以解决这个问题,但所有这些方法都不会以某种方式关闭.1 (除非我们将项目类型更改为Windows窗体应用程序以外的其他内容)
我认为最简单的方法是创建3种形式:
form1 - 将保持不可见并充当经理,如果需要,您可以指定它来处理托盘图标。
form2 - 将有一个按钮,单击该按钮将关闭form2并将打开form3
form3 - 将具有需要打开的其他表单的角色。
以下是完成该操作的示例代码:
(我还添加了一个从第3版关闭应用程序的示例)
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's 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。
祝你好运。
答案 4 :(得分:6)
你并不具体,但看起来你正试图在我的Win Forms应用程序中做我做的事情:从登录表单开始,然后在成功登录后,关闭该表单并将焦点放在主表单上。我是这样做的:
使frmMain成为启动形式;这就是我的Program.cs的样子:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
在我的frmLogin中,创建一个初始化为false的公共属性,只有在成功登录时才设置为true:
public bool IsLoggedIn { get; set; }
我的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。由于它是启动形式,当它关闭时,应用程序结束。
答案 5 :(得分:1)
在form1中使用此代码段。
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();
}
我是从here
得到的答案 6 :(得分:1)
如果您有两种形式: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();
答案 7 :(得分:1)
我通常这样做是为了在表单之间来回切换。
首先,在 Program 文件中,保留 ApplicationContext 并添加一个帮助器 SwitchMainForm 方法。
static class Program
{
public static ApplicationContext AppContext { get; set; }
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Save app context
Program.AppContext = new ApplicationContext(new LoginForm());
Application.Run(AppContext);
}
//helper method to switch forms
public static void SwitchMainForm(Form newForm)
{
var oldMainForm = AppContext.MainForm;
AppContext.MainForm = newForm;
oldMainForm?.Close();
newForm.Show();
}
}
然后在代码中的任意位置,我调用 SwitchMainForm 方法以轻松切换到新表单。
// switch to some other form
var otherForm = new MyForm();
Program.SwitchMainForm(otherForm);
答案 8 :(得分:0)
假设您有两个表单,第一个表单名称是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();
}
希望此代码可以帮助您
答案 9 :(得分:0)
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
}
答案 10 :(得分:0)
//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();
}
答案 11 :(得分:0)
此代码可以帮助您:
Master frm = new Master();
this.Hide();
frm.ShowDialog();
this.Close();
答案 12 :(得分:0)
this.Visible = false;
//or // will make LOgin Form invisivble
//this.Enabled = false;
// or
// this.Hide();
Form1 form1 = new Form1();
form1.ShowDialog();
this.Dispose();
答案 13 :(得分:0)
我认为这更容易:)
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();
}
答案 14 :(得分:-3)
我会这样做:
private void button1_Click(object sender, EventArgs e)
{
Form2 m = new Form2();
m.Show();
Form1 f = new Form1();
this.Visible = false;
this.Hide();
}