当我从登录界面打开一个新表单时,它会将用户登录,显示表单然后立即消失???
以下是相关部分的代码:
string checkAdmin = "select * from Logins where Name = @userName and UserType ='Admin'";
string checkUser = "select * from Logins where Name = @userName and UserType ='User'";
using (var connection = new SqlConnection(@"server=.\SQLEXPRESS; database=loginsTest;Trusted_Connection=yes"))
{
using (var checkAdminCommand = new SqlCommand(checkAdmin, connection))
{
//guessing at the column length here. Use actual column size instead of 20
checkAdminCommand.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = userNameBox.Text;
connection.Open();
if (checkAdminCommand.ExecuteScalar() != null)
{
adminScreen admnscrn = new adminScreen();
admnscrn.Show();
this.Close();
return;
}
else
{
}
}
using (var connection = new SqlConnection(@"server=.\SQLEXPRESS; database=loginsTest;Trusted_Connection=yes"))
{
using (var checkUserCommand = new SqlCommand(checkUser, connection))
{
//guessing at the column length here. Use actual column size instead of 20
checkUserCommand.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = userNameBox.Text;
connection.Open();
if (checkUserCommand.ExecuteScalar() != null)
{
userScreen usrscrn = new userScreen();
usrscrn.Show();
this.Close();
}
else
{
MessageBox.Show("Invalid details, try again");
passwordBox.Text = "";
}
}
}
所以,当我打开usrscrn或admnscrn时,它会轻弹并再次直接退回?我试过研究,我用过Application.Run(userScreen());等,它只是抛出了一个关于第二个消息循环的异常?
我创建了一个新屏幕,将其设置为MDI,并输入以下代码:
private void MDI_Form_Load(object sender, EventArgs e)
{
Form1 loginscrn = new Form1();
loginscrn.Show();
}
我的program.cs文件包含以下代码:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MDI_Form());
}
这会起作用吗?
答案 0 :(得分:3)
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
这是大多数Windows窗体项目中的样板引导代码。它会创建一个Form作为主窗口,并在其上调用Application.Run
。这使它运行一个消息循环,允许Form以事件驱动的方式执行(等待用户输入)。当您在此主表单上致电Close
时,您的Application.Run
方法会返回,并且您的Main
方法会运行完成,导致您的程序退出。
听起来我想要做的就是显示一个像启动画面或登录窗口的表单,然后当它关闭时你想要显示另一个表单并运行 second 表单作为你的主要形式。
要做到这一点,至少有几种方法:
Main
方法,以便创建登录表单,在其上调用Application.Run
并等待它关闭,然后通过DialogResult
属性等属性分析结果知道这是否成功。然后它可以在以后创建您的主表单并再次在其上调用Application.Run
。在这种情况下,您的代码可能如下所示:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LoginForm loginForm = new LoginForm();
Application.Run(loginForm);
if (loginForm.DialogResult == DialogResult.OK)
{
Application.Run(new MainForm());
}
else
{
// Error handling
}
}
Main
方法来运行主窗体而不是登录窗体,然后让主窗体使用Form.ShowDialog
方法将登录窗口显示为对话框。您可以尝试在主窗体尚未显示之前执行此操作,或者将主窗体Visible
属性设置为false,以便看起来您的登录窗口实际上是主窗口。以下是你如何做到这一点:
private void MainForm_Load(object sender, EventArgs e)
{
this.Visible = false;
using (var loginForm = new LoginForm())
{
if (loginForm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
{
this.Visible = true;
}
else
{
// Error handling
Close();
}
}
}
您只需要确保您的LoginForm根据需要正确设置DialogResult = DialogResult.OK
或其他内容,以表示成功登录。
答案 1 :(得分:-2)
您需要MDI表单(多文档界面),其中包含其他表单,因此当您关闭一个表单时,它不会终止所有应用程序。
或者 通过创建另一个隐藏的表单并使其成为启动表单
,使您的登录表单不是明星形式