0

ログインフォームと、ユーザー名とパスワードが正しいかどうかを確認するボタンがあります。しかし、問題は私が試したコードです..接続ボタンを2回クリックする必要があります。

しかし、ボタンを1回クリックすると、コードは機能するはずです。右 ?

問題は次のとおりです。DialogResultが値に設定されているボタンをクリックしただけではshowDialogが消えないため、最初のクリックでconnexionButton.DialogResultがDialogResult.OK値を取得し、2番目のボタンをクリックします。コードを実行します。

*イベント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

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();
}
于 2012-10-01T18:13:57.010 に答える
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 に答える
1

のではなく、に設定Form.DialogResultする必要があります。DialogResult.OKDialogResultButton

いくつかのコード:

this.DialogResult = DialogResult.OK

いくつかの追加の考え:

  • ユーザーの存在を確認するためのスタンドアロンメソッドを構築することをお勧めします。でこれを行わないでくださいClickEvent。たぶん、このメソッドが再び必要になり、それからこれを書き直します。これは肥大化したコードのみを生成します。

  • テキストボックスに値が入力される前に、ユーザーがボタンをクリックできないようにします。

于 2012-10-01T19:07:05.020 に答える