c#:创建一个连接按钮

时间:2012-10-01 18:01:45

标签: c# winforms

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

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

我认为问题是: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();
}

4 个答案:

答案 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​​}}中执行此操作。也许你再次需要这个方法,然后你会重写这个。这只会产生臃肿的代码。

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