0

我有一个登录表单和一个按钮,用于检查用户名和密码是否为真。但问题是我试过的代码..我必须点击连接按钮两次。

但是当我单击按钮一次时,代码应该可以工作!正确的 ?

我认为问题是:如果我单击某个按钮,它的 DialogResult 设置为某个值,那么 showDialog 不会消失,因此在第一次单击时 connexionButton.DialogResult 获取 DialogResult.OK 值,然后在第二次单击按钮执行代码。

*您可以注意到事件 simpleButton1_Click 是 connexionButton 按钮的事件*

这是我使用的事件:

  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();
}
4

4 回答 4

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);
    }
}    
于 2012-10-01T18:11:04.190 回答
2

将行的迭代器从 AsEnumerable 更改为 Rows。

从:

foreach (var row in myClass.ds.Tables["Users"].AsEnumerable())

至:

foreach (var row in myClass.ds.Tables["Users"].Rows) 

这可能听起来很奇怪,但如果在任何地方对该表有任何更改,那么当您迭代您的可枚举时,它将破坏您的迭代。请参阅DataTableExtensions.AsEnumerable 这可能是同时访问此表的另一个进程,或者使用在迭代开始之前尚未完成填充表的数据读取器。

此外,尝试更改代码以直接访问表单的对话框结果,而不是通过按钮。

从:

connexionButton.DialogResult = DialogResult.OK;

至:

this.DialogResult = DialogResult.OK;

您的代码应仅在您的布尔值设置为 true 时进行设置,因此如果您的检查正确,您将不会关闭表单。

于 2012-10-01T19:08:02.213 回答
2

您正在使用simpleButton1_Click_1而不是simpleButton1_Click. 事实上,代码应该是:

this.simpleButton1.Click += new System.EventHandler(this.simpleButton1_Click);

编辑 :

是的,我只是忘记了当我复制事件时.. 我的意思是 this.connexionButton.Click += new System.EventHandler(this.simpleButton1_Click);

我认为,在这种情况下,您应该使用 abool而不是 a 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();
}
于 2012-10-01T18:13:57.010 回答
1

您需要将 设置Form.DialogResult为,而DialogResult.OK不是DialogResultButton

一些代码:

this.DialogResult = DialogResult.OK

一些额外的想法:

  • 构建一个独立的方法来检查用户的存在显然更好。不要在ClickEvent. 也许你再次需要这个方法,然后你会重写它。这只会产生臃肿的代码。

  • 防止用户在文本框填充值之前单击按钮。

于 2012-10-01T19:07:05.020 回答