2013-04-10 63 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(); 
    } 
}