1

下の写真は私のC#アプリのスクリーンショットです

ユーザー名の入力が有効であることを確認するために、検証を行うためのコールバック メソッドを追加しました。

Regex UserNameRE = new Regex(@"^[a-zA-Z]\w*$");
//being called when input box is not focused any more
private void UserNameInput_Leave(object sender, EventArgs e)
{
    //pop up a warning when user name input is invalid
    if (!UserNameRE.IsMatch(UserNameInput.Text))
    {
        MessageBox.Show("Invalid User Name!");
        this.UserNameInput.Text = "";
        this.UserNameInput.Focus();
    }
}

このメソッドは、ユーザーが入力を終了したときに呼び出されます (このメソッドは、「入力ボックスを離れる」というイベントにバインドされています)。ユーザーが無効な User_Name を残してパスワードの入力を開始すると機能します。

ただし、ユーザーが別のタブ、たとえば [登録] タブをクリックしたときにも機能します。私はこれが起こってほしくない。ユーザーが「登録」タブをクリックした場合、明らかにログインしたくないので、私のC#アプリは警告ボックスをポップアップして、有効なユーザー名を再度入力するよう強制するべきではありません.

C# は、このような 2 つの状況の違いをどのように見分けることができますか? どのオブジェクトがクリックされているかがわかれば簡単です。

4

3 に答える 3

2

sourceイベントのオブジェクトsenderにイベントがありUserNameInput_Leaveます。

private void UserNameInput_Leave(object sender, EventArgs e)
{
     //sender is source of event here
}
于 2013-03-26T10:26:53.277 に答える
1

ここにオプションがあります:

private void UserNameInput_Leave(object sender, EventArgs e)
    {
        if (sender.GetType() != typeof(TextBox))
        {
            return;
        }
        TextBox tBox = (TextBox)sender;
        //pop up a warning when user name input is invalid
        if (!UserNameRE.IsMatch(UserNameInput.Text) && tBox.Name == UserNameInput.Name)
        {
            MessageBox.Show("Invalid User Name!");
            this.UserNameInput.Text = "";
            this.UserNameInput.Focus();
        }
    }
于 2013-03-26T10:33:33.310 に答える
0

ここで、この特定のシナリオに適切な解決策があるかどうかはわかりません。

マウスを離したときにコントロールを検証するハンドラーを追加すると、タブ内の別のコントロールまたは別のタブ自体をクリックしたかどうかに関係なく、確実に最初に実行されます。

この正常な流れは簡単には無視できません。メッセージループを自分で処理することで可能になるはずですが、イベントベースのフロー、最初にフォーカスを離れる、および選択されたインデックスの変更 (選択) イベントが発生します。検証はクライアント側で非常に高速であるため、フローを乱さないようにすることをお勧めします。メッセージボックスの代わりに、ErrorProvider必要に応じてコントロールを使用して添付することをお勧めします。また、メッセージボックスは非常に邪魔であり、コードに従って、強制的にテキストボックスに再び焦点を合わせています。

次のコードはどうですか?

public partial class Form1 : Form
{
    ErrorProvider errorProvider = new ErrorProvider();
    public Form1()
    {
        InitializeComponent();
        textBox1.Validating += new CancelEventHandler(textBox1_Validating);
    }

    private void textBox1_Leave(object sender, EventArgs e)
    {
        textBox1.CausesValidation = true;
    }

    void textBox1_Validating(object sender, CancelEventArgs e)
    {
        Regex UserNameRE = new Regex(@"^[a-zA-Z]\w*$");
        if (!UserNameRE.IsMatch(textBox1.Text))
        {
            errorProvider.SetError(this.textBox1, "Invalid username");
        }
    }
}
于 2013-03-26T11:24:59.510 に答える