2013-10-09 29 views
0

我正在使用c#。爲什麼CausesValidation不會從容器傳播到子控件?

爲什麼CausesValidation屬性不會從容器傳播到子控件?

我有一個TabControl,我需要在所有選項卡上執行用戶輸入驗證。 但每個標籤都是獨立的。我發現如果我有一個像TableLayoutPanel的容器,並將CausesValidation設置爲false,則子組件仍然執行驗證。

所以這個代碼是行不通的:

Foreach(Control c in Container.Controls) 
{ 
    c.CausesValidation = False; 
} 

如果你做一些調試輸出,你會看到,只發現控件是TableLayoutPanel中或類似的GroupBox任何其他容器中會被發現,並設置爲False 。但容器不會將該值傳播到子級別。 很多人問我們如何才能解決問題。我發現了很多方法,但是我創建了一個靜態類,它允許我在TabControl上選擇我想要執行驗證的選項卡,並且它將在該TabControl的所有控件上設置CausesValidation爲False,包括帶有10層的深度。如果你想要這個圖書館只是要求它!

我真正的問題是,不應該容器傳播該屬性到其子控件,並且該子控件可以控制任何子控件?

通過創建非常特定的應該從頭開始工作的非常具體的代碼,可以爲我們節省很多工作嗎?爲什麼這不是隱含的?

回答

1

這只是不建設性的方式來處理您的要求。該功能沒有按照您喜歡的方式實現,而且這種功能永遠不會改變。這不是一個問題,你可以很容易地用自己的代碼一丁點兒添加:

public static void SetCausesValidation(Control.ControlCollection ctls, bool enable) { 
     foreach (Control ctl in ctls) { 
      ctl.CausesValidation = enable; 
      SetCausesValidation(ctl.Controls, enable); 
     } 
    } 

而在你的形式構造函數中使用它,像:

public Form1() { 
     InitializeComponent(); 
     SetCausesValidation(panel1.Controls, false); 
    } 

注意使用遞歸在通過容器內整個控件樹來設置屬性的方法中。

相關問題