2

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

假设我使用包含许多控件的 winform 设计了一个对话框。

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

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

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

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

欢迎任何想法或评论:)

4

1 回答 1

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();
    }
}
于 2013-04-10T16:17:44.383 回答