【问题标题】:Binding a Winform to a Dictionary or Key/Value List将 Winform 绑定到字典或键/值列表
【发布时间】:2012-04-07 16:09:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您有 WPF 应用程序,这会容易得多。

标签: c# winforms data-binding .net-3.5 data-persistence


【解决方案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
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多