2012-03-23 52 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 
      } 
     } 
    }