2012-03-23 51 views
1

我有一个Winforms应用程序,它动态实例化外部表单对象以用于配置UI。每个动态实例化的表单都放置在一个TabPage中。将Winform绑定到词典或键/值列表

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

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

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

+1

如果你有一个WPF应用程序,这将容易得多。 – Bernard 2012-03-23 02:49:08

回答

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 
      } 
     } 
    }