1

我有一个 Winforms 应用程序,它动态实例化外部表单对象以在配置 UI 中使用。每个动态实例化的表单都放置在 TabPage 中。

我想创建一个接受字典或键/值列表的属性,并用这些值填充表单,将控件的值与字典中键的值匹配。相反,该属性还将返回一个 Key/Value 列表,该列表对应于 Winform 中控件的值。

这是一个简单的绑定问题,还是我需要编写自定义代码?那个代码会是什么样子?

过去,我通过编写DTO类、使用 XML 序列化和反序列化来持久化类的数据并将表单字段连接到 DTO 对象的字段来实现这一点。问题是,由于表单是从外部 DLL 动态实例化的,因此无法静态“引用”这个 DTO 类,所以我正在寻找一种更动态的方法。

4

1 回答 1

1

结果比我想象的要容易。

public Dictionary<string, string> Values
{
    get
    {
        var values = new Dictionary<string, string>();
        foreach (var control in Controls)
        {
            switch(control.GetType().Name) 
            {
                case "TextBox" : 
                    var textBox = (TextBox)control;
                    values.Add(textBox.Name, textBox.Text);
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    values.Add(comboBox.Name, comboBox.SelectedItem.ToString());
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    values.Add(checkBox.Name, checkBox.Checked.ToString());
                    break;

                // TODO: Add additional cases to support other control types
            }
        }
        return values;
    }
    set
    {
        foreach (var control in Controls)
        {
            switch (control.GetType().Name)
            {
                case "TextBox":
                    var textBox = (TextBox)control;
                    textBox.Text = value[textBox.Name];
                    break;
                case "ComboBox":
                    var comboBox = (ComboBox)control;
                    comboBox.SelectedItem = value[comboBox.Name];
                    break;
                case "CheckBox":
                    var checkBox = (CheckBox)control;
                    checkBox.Checked = bool.Parse(value[checkBox.Name]);
                    break;

                // TODO: Add additional cases to support other control types
            }
        }
    }
于 2012-03-23T03:40:32.590 回答