我是c#的新手。有注册项目的登录系统。表格有问题。
我有2个表单,form1和form2。 Form1是我的主要表单,我的登录表单。 Form2是注册表。
这就是应用程序的运行方式: 在form1显示之前,首先要满足一个条件。如果满足条件,将出现消息框,然后将显示form2。但是,当条件不满足时,将显示form1。
所以问题是,尽管满足条件,form1仍然会显示。 Form2出现,但form1也出现了。
private void Form1_Load(object sender, EventArgs e)
{
if (condition)
{
MessageBox.Show("Message");
this.Hide();
Form2 frm = new Form2();
frm.Show();
}
}
答案 0 :(得分:2)
你不应该在Form_Load
Form1
开始做这类事情。从逻辑上讲,首先测试你的病情是最有意义的,如果你不打算使用它,就不要实例化Form1
。
在Program.cs
内,如果您还没有改变它,您应该拥有以下代码行:
Application.Run(new Form1());
您应该使用某些代码替换该行以测试您的情况并确定要启动的表单:
if (condition)
{
MessageBox.Show("Message");
Application.Run(new Form2());
}
else
{
Application.Run(new Form1());
}
答案 1 :(得分:1)
您的问题似乎是load
事件在表单可见之前触发的事实。从技术上讲,在这一点上它没有隐藏的东西。
答案 2 :(得分:1)
有很多方法可以做到这一点但我实现登录表单的首选方法是:
private void btnLogin_Click(object sender, EventArgs e)
{
if (CheckUserPassword())
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
else MessageBox.Show("Login failed!");
}
登录按钮的登录表单中的典型处理程序方法:
using (var context = new PrincipalContext(ContextType.Domain, "TRY.local"))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (var result in searcher.FindAll())
{
DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
Library.WriteErrorLog("First Name: " + de.Properties["givenName"].Value);
try{
string name = (string)de.Properties["samaccountname"].Value;
PrincipalContext ctx = new PrincipalContext(ContextType.Domain,"TRY.local","CN="+name+",OU=Users,DC=TRY,DC=local","administrator","password");
UserPrincipal usr = UserPrincipal.FindByIdentity(ctx, name);
if(usr!=null){
Library.WriteErrorLog("IsAccountLockedOut\t"+usr.IsAccountLockedOut());
}
usr.Dispose();
ctx.Dispose();
}
catch(Exception e){
Library.WriteErrorLog(e);
}
}
}