我有一个登录表单和一个按钮,用于检查用户名和密码是否为真。 但问题是我试过的代码..我必须点击连接按钮两次。
但是当我单击按钮一次时,代码应该可以正常工作!对吗?
我认为问题是:showDialog不会消失,只要我点击某个按钮,它的DialogResult设置了某个值,所以在第一次点击时,connexionButton.DialogResult获取DialogResult.OK值,在第二个单击按钮执行代码。
* 您可以注意到事件simpleButton1_Click是connexionButton Button的事件*
这是我使用的事件:
this.connexionButton.Click += new System.EventHandler(this.simpleButton1_Click);
这是我尝试过的代码:
private void simpleButton1_Click(object sender, EventArgs e)
{
Boolean allowCnx = false;
foreach (var row in myClass.ds.Tables["Users"].AsEnumerable())
{
if (row[1].ToString().ToLower() == idBox.Text.ToLower() && row[2].ToString().ToLower() == mdpBox.Text.ToLower())
{
allowCnx = true;
}
}
if (allowCnx)
{
connexionButton.DialogResult = DialogResult.OK;
}
else
XtraMessageBox.Show("Invalide Information", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
这是我用来调用此登录表单的代码:
using (login loginForm = new login())
{
var result = loginForm.ShowDialog();
if (result == DialogResult.OK)
this.Show();
else
this.Close();
}
答案 0 :(得分:5)
// Points to a different method than the one you posted
// (simpleButton1_Click_1 instead of simpleButton1_Click)
this.simpleButton1.Click += new System.EventHandler(this.simpleButton1_Click_1);
// This isn't simpleButton1_Click_1
private void simpleButton1_Click(object sender, EventArgs e)
不确定这是否是您的问题,但看起来您的事件处理程序与您发布的方法不同。您的代码中是否有另一个名为simpleButton1_Click_1
的方法,您只是稍微感到困惑?
编辑:响应您的更改/添加
你似乎对ShowDialog和DialogResult有些困惑。
// When you launch the login form, I do not know what you intended to do with your
// calls to Show() and Close() but so long as you don't instend for them to do
// anything to the loginForm, that's fine.
using (login loginForm = new login())
{
if (loginForm.ShowDialog() == DialogResult.OK)
// Do stuff if logged in
else
// Do stuff if failed
}
private void simpleButton1_Click(object sender, EventArgs e)
{
Boolean allowCnx = false;
foreach (var row in myClass.ds.Tables["Users"].AsEnumerable())
if (row[1].ToString().ToLower() == idBox.Text.ToLower() && row[2].ToString().ToLower() == mdpBox.Text.ToLower())
{
allowCnx = true;
}
if (allowCnx)
{
this.DialogResult = DialogResult.OK; // Don't set the DialogResult of a button. Set it for the form.
}
else
{
this.DialogResult = DialogResult.Abort; // Because we didn't succeed
XtraMessageBox.Show("Invalide Information",
"Erreur",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
答案 1 :(得分:2)
您使用simpleButton1_Click_1
代替simpleButton1_Click
。
事实上,代码应该是:
this.simpleButton1.Click += new System.EventHandler(this.simpleButton1_Click);
编辑:
是的,我忘记了复制活动时的意思..我的意思是 this.connexionButton.Click + = new System.EventHandler(this.simpleButton1_Click);
我认为,在这种情况下,您应该使用bool
代替DialogResult
,所以请尝试:
public bool AllowConnection = false;
private void simpleButton1_Click(object sender, EventArgs e)
{
foreach (var row in myClass.ds.Tables["Users"].AsEnumerable())
{
if (row[1].ToString().ToLower() == idBox.Text.ToLower() && row[2].ToString().ToLower() == mdpBox.Text.ToLower())
AllowConnection = true;
}
if (!AllowConnection)
XtraMessageBox.Show("Invalide Information", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
和
using (login loginForm = new login())
{
loginForm.ShowDialog();
if (loginForm.AllowConnection)
this.Show();
else
this.Close();
}
答案 2 :(得分:2)
将行的迭代器从AsEnumerable更改为Rows。
FROM:
foreach (var row in myClass.ds.Tables["Users"].AsEnumerable())
TO:
foreach (var row in myClass.ds.Tables["Users"].Rows)
这可能听起来很奇怪,但是如果对该表有任何改变,那么当你迭代你的可枚举时,它会破坏你的迭代。请参阅DataTableExtensions.AsEnumerable这可能是同时访问此表的另一个进程,或者是在迭代开始之前使用尚未完成填充表的datareader。
此外,尝试更改代码以直接访问表单的对话框结果,而不是通过按钮。
FROM:
connexionButton.DialogResult = DialogResult.OK;
TO:
this.DialogResult = DialogResult.OK;
您的代码应该只设置如果您的布尔值设置为true,那么如果检查正确,您将不会关闭表单。
答案 3 :(得分:1)
您需要将Form.DialogResult
设置为DialogResult.OK
,而不是DialogResult
的{{1}}。
一些代码:
Button
一些额外的想法:
建立一个独立的方法进行检查显然更好 用户的存在。请勿在{{1}}中执行此操作。也许你再次需要这个方法,然后你会重写这个。这只会产生臃肿的代码。
阻止用户在文本框填充值之前单击按钮。