2013-04-10 71 views
2

希望這是一個有趣的問題:Winform控件默認值和驗證

比方說,我已經設計了一個對話框使用的winform其中包含了一些控制。 (1)打開此對話框時,我想爲所有控件設置默認值。但是,一個控件的值可能取決於另一個控件(或某些其他控件)的值。 (2)當用戶改變了一個控件的值時,我想驗證整個上下文中的新值。換句話說,我有很多規則說明什麼樣的組合值是可以接受的(如果控件A的值爲1,控件B的值爲2,那麼控件C的值不能爲3)

現在假設我可以保證我所定義的所有「規則」都不會在死循環中結束。

我的問題是:是否有任何已知的框架或普遍的做法來處理這個問題?我不希望它是特定於我創建的特定對話框。我希望它是一個這樣的框架,我只是簡單地定義「規則」 - 規定哪些組合是無效的,規則是什麼是控制的推斷值 - 並且框架將在控制值變化時評估這些規則。

任何想法或評論表示歡迎:)

+0

你能不能給我們什麼樣的規則你想要1個或2個例子將是很好 – MethodMan 2013-04-10 16:15:32

+0

所有規則通常形式的想法:如果(controlA.Value是一些列表中&& controlB.Value是內一些其他列表),那麼controlC不能有值xxx。具體來說,考慮這個例子:假設我們有對話框,用戶可以從亞馬遜,輸入數量和價格中選擇產品。我們還會在對話框中顯示用戶帳戶的餘額。結果是:如果product.SelectValue在折扣列表內,價格將是原始價格乘以0.8。 – Xinchao 2013-04-11 15:26:20

+0

另一個規則可能是數量*價格必須小於賬戶餘額 – Xinchao 2013-04-11 15:41:04

回答

0

我不知道是否有這種模式的一個名稱或者即使最好的做法,但我一般在下列方式處理它。我只顯示一個控件,但設計很容易支持添加更多控件。

public partial class Form1 : Form 
{ 
    private EventHandler textBoxChanged; 

    public Form1() { 
     InitializeComponent(); 

     this.Load += new EventHandler(Form1_Load); 

     textBoxChanged = new EventHandler(textBox1_TextChanged); 
    } 

    void setEventHandlers() { 
     textBox1.TextChanged += textBoxChanged; 
    } 

    void removeEventHandlers() { 
     textBox1.TextChanged -= textBoxChanged; 
    } 

    void textBox1_TextChanged(object sender, EventArgs e) { 
     checkAndUpdate(sender as TextBox); 
    } 

    void Form1_Load(object sender, EventArgs e) { 
     // set minimum required set of default values ... 

     setEventHandlers(); 
     checkAndUpdate(null); 
    } 

    private void checkAndUpdate(Control userModified) { 
     removeEventHandlers(); 

     // enforce rules 
     // if rules are violated, you can notify the user 
     // of the offending control: userModified 

     // update dependent controls 

     setEventHandlers(); 
    } 
}