2013-03-26 83 views
1

The pic below is the screenshot of my C# app如何知道在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

爲什麼不在用戶點擊提交按鈕時進行檢查?你不會再有問題了...... – LaGrandMere 2013-03-26 10:27:57

+0

做一件事..而不是「離開」事件,嘗試密碼「OnSetFocus()」或類似的東西..以便您的預定義條件可以得到滿足。但在這一點上,你將面臨更多問題。 「如果用戶直接進入密碼字段」,還有一件事,一旦用戶名字段得到一些輸入,啓用密碼字段,直到禁用輸入。希望你得到它.. – 2013-03-26 10:29:16

+0

謝謝你,@拉格朗米爾。點擊提交按鈕後執行檢查必須更容易,但它只能解決我目前遇到的問題,並不能回答我提出的問題。也許有一天,我仍然需要在另一種情況下實現這樣的功能。 – Leonard 2013-03-27 02:59:14

回答

2

您將在UserNameInput_Leave事件的對象sender中發生事件source

private void UserNameInput_Leave(object sender, EventArgs e) 
{ 
    //sender is source of event here 
} 
+0

在這兩種情況下源不會始終是他的文本框? – LaGrandMere 2013-03-26 10:29:34

+0

亞我認爲@LaGrandMere是正確的。 – Mogli 2013-03-26 10:30:16

+0

@LaGrandMere說實話,這種方法不免有幫助。 – Leonard 2013-03-27 03:09:46

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

嘿,親愛的@ jordanhill123。離開事件的發送者始終是文本框 - 「UserNameInput」本身。這意味着,問題仍然存在。 – Leonard 2013-03-27 03:15:35

0

我不知道是否有在這裏這個特定的情況下一個合適的解決方案。

當您添加一個處理程序來驗證鼠標離開時的控制權時,肯定會先執行它,而不管您是否在該選項卡或另一個選項卡本身中單擊另一個控件。

這種正常流量不容易被忽略。它必須可以通過自己來處理消息循環,但是基於事件的流程,首先離開焦點,選擇的索引更改(選擇)事件將被觸發。我建議你不要打擾流程,因爲驗證是客戶端和相當快的。我建議您使用ErrorProvider而不是消息框,並在需要時附加到控件上。此外,messagebox是相當令人不安的,根據你的代碼,你有力地使它重新聚焦到文本框。

下面的代碼如何?

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"); 
     } 
    } 
} 
+0

令人敬畏的方式給客戶一個警告。但是我仍然需要找到其他的東西來代替「離開事件」。 – Leonard 2013-03-27 03:36:49

+0

如果你可以使用WinProc處理windows消息,那麼你將能夠實現你的邏輯,但你必須在你從中獲得的成本和價值之間取得平衡。 – sarat 2013-03-27 14:00:39

相關問題