Winform控件值默认和验证

时间:2013-04-10 16:00:42

标签: c# winforms

希望这是一个有趣的问题:

假设我使用winform设计了一个Dialog,其中包含许多控件。

(1)打开此对话框时,我想为所有控件设置默认值。但是,一个控件的值可能取决于另一个控件(或其他一些控件)的值。

(2)当用户更改了一个控件的值时,我想在整个上下文中验证新值。换句话说,我有很多规则说明哪些值的组合是可接受的(如果控件A的值为1,而控件B的值为2,则控件C的值不得为3)

我们现在假设我可以保证我定义的所有“规则”都不会以死循环结束。

我的问题是:是否有任何已知的框架或通用做法以一般方式处理此问题?我不希望它特定于我创建的这个特定对话框。我希望它是这样一个框架,我只是定义“规则” - 规则说什么组合无效,规则说什么是控件的推断值 - 框架将在控制值发生变化时评估这些规则。

欢迎任何想法或评论:)

1 个答案:

答案 0 :(得分: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();
    }
}