2013-06-28 37 views
0

這裏是我的情況:我有兩個TabPage'stabPage1 & tabPage2)一TabControltabPage2具有我創建的自定義用戶控件(因爲它以多種形式使用),其中包含一個TextBox,該控件通過自定義用戶控件的Validating事件附加了一些自定義驗證。如果我選擇了tabPage2,並在文本框中輸入了無效數據並嘗試離開文本框,驗證按原樣進行,我的自定義事件處理程序將運行,並按照我的指示操作。但是,如果(在這種情況下)我從tabPage2切換到tabPage1而不是僅僅離開文本框,則允許切換到tabPage1。我的文本框會被驗證兩次。此外,我無法控制窗體上的其他任何內容,因爲如果發現文本框無效,但我無法看到文本框能夠將任何有效數據放入窗體中,因此我會將文本框設置爲焦點! (我希望一切都有道理,不要害怕請求我澄清,如果需要的話)。所選選項卡允許更改,即使場無效

這是我的問題:如何發現字段無效時停止切換選項卡;從而也解決了驗證運行兩次的問題?

這裏是我的代碼:(此方法包含中提到的自定義用戶控件。)

private void OnValidatingUserControl(object sender, CancelEventArgs args) 
{ 
    if (IsTextBoxInvalid()) 
    { 
    args.Cancel = true; 
    MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 

    this.textBox.Focus(); 
    } 
} 
+1

也許你需要找到'BeforeChangeTab'(或類似名稱)的事件,並在那裏,調用文本框驗證,告訴標籤,如果他們能改不前。 –

+0

我無法找到該事件,因此它將是'SelectedIndexChanged',如果驗證爲false,則返回到文本框選項卡。 –

+0

@Daniel好的建議,但是,驗證發生在我創建的單獨的用戶控件中。所以,用戶控件並不知道它所在的「TabPage」。我曾嘗試檢查用戶控件的「Parent」是否爲「TabPage」,如果是,則選擇「TabPage」,然後給我的文本框焦點...但如果「TabPage」包含「包含用戶控件的面板。此外,驗證仍然運行兩次,所以我看到消息框兩次。 – bsara

回答

1

我通過以下操作解決了這個問題:

tabCtrl.CausesValidation = false; 
tabPage1.CausesValidation = false; 
tabPage2.CausesValidation = false; 
userCtrl.CausesValidation = false; 

我真不」只要用戶在驗證之前不能離開表單,那麼不管它是否被切換。所以,這個解決方案允許切換標籤,但仍然允許正常驗證。我也重做我OnValidatingTextBox代碼,這樣的標籤會被選中之前,焦點就轉移到外地的錯誤:

private void OnValidatingUserControlPanel(object sender, CancelEventArgs args) 
{ 
    if (IsTextBoxInvalid()) 
    { 
    args.Cancel = true; 
    MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 

    this.GiveFocusToControlIfTabPage(this.Parent); 
    this.textBox.Focus(); 
    } 
} 

private void GiveFocusToControlIfTabPage(Control ctrl) 
{ 
    if (ctrl== null) 
    { 
    return; 
    } 
    if (ctrl is TabPage) 
    { 
    TabPage tabPage = (TabPage)ctrl; 
    ((TabControl)tabPage.Parent).SelectedTab = tabPage; 
    return; 
    } 
    this.GiveFocusToControlIfTabPage(ctrl.Parent); 
} 
0

雖然你找到了你的問題的解決方案,如果你需要,以防止用戶更改選項卡,你可以創建一個全局變量

static class GlobalVariables 
{ 
    public static bool UserControlValidationError = false; 
} 

變化在OnValidatingUserControl

private void OnValidatingUserControl(object sender, CancelEventArgs args) 
{ 
    if (IsTextBoxInvalid()) 
    { 
    args.Cancel = true; 
    GlobalVariables.UserControlValidationError = true; 
    MessageBox.Show("Invalid data in text box!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 

    this.textBox.Focus(); 
    } 
    else 
    { 
    GlobalVariables.UserControlValidationError = false; 
    } 
} 

其狀態,防止標籤來改變這樣

private void tabCtrl_Selecting(object sender, TabControlCancelEventArgs e) 
{ 
    e.Cancel = GlobalVariables.UserControlValidationError; 
}