nih*_*que 168
史蒂夫的解决方案不起作用.调用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();
}
Run Code Online (Sandbox Code Playgroud)
Mon*_*ska 22
试着这样做......
{
this.Hide();
Form1 sistema = new Form1();
sistema.ShowDialog();
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
Man*_*zor 14
其他答案已经描述了许多不同的方式.然而,他们中的许多人要么参与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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
G.Y*_*G.Y 10
问题出在那条线上:
Application.Run(new Form1());
您可以在program.cs文件中找到它.
此行表示form1将处理消息循环 - 换句话说,form1负责继续执行您的应用程序 - 当form1关闭时,应用程序将被关闭.
有几种方法可以解决这个问题,但所有这些方法都不会以某种方式关闭form1.
(除非我们将项目类型更改为Windows窗体应用程序以外的其他内容)
我认为最简单的方法是创建3种形式:
form1 - 将保持不可见并充当管理员,如果需要,您可以指定它来处理托盘图标.
form2 - 将有按钮,单击该按钮将关闭form2并将打开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's close form1.
}
}
Run Code Online (Sandbox Code Playgroud)
注意:使用面板或动态加载用户控件更具学术性,更适合作为行业生产标准 - 但在我看来,您只是试图推断出事情是如何工作的 - 为此目的,这个例子更好.
现在理解这些原则让我们只用两种形式来尝试:
第一个表单将扮演管理员的角色,就像前面的示例一样,但也会显示第一个屏幕 - 所以它不会被隐藏.
第二种形式将扮演显示下一个屏幕的角色,单击按钮将关闭应用程序.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您更改上一个示例 - 从项目中删除form3.
祝好运.
小智 6
你并不具体,但看起来你正试图在我的Win Forms应用程序中做我做的事情:从登录表单开始,然后在成功登录后,关闭该表单并将焦点放在主表单上.我是这样做的:
使frmMain成为创业形式; 这是我的Program.cs的样子:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
Run Code Online (Sandbox Code Playgroud)在我的frmLogin中,创建一个初始化为false的公共属性,并且只有在成功登录时才设置为true:
public bool IsLoggedIn { get; set; }
Run Code Online (Sandbox Code Playgroud)我的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;
}
Run Code Online (Sandbox Code Playgroud)没有成功登录?退出应用程序.否则,继续使用frmMain.由于它是启动形式,当它关闭时,应用程序结束.
小智 -1
假设您有两个表单,第一个表单名称为 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();
}
Run Code Online (Sandbox Code Playgroud)
希望这段代码能帮助你