2012-03-23 1 views
1

У меня есть приложение Winforms, которое динамически создает объекты внешней формы для использования в пользовательском интерфейсе конфигурации. Каждая динамически созданная форма помещается в TabPage.Связывание Winform с словарем или ключом/списком значений

Я хотел бы создать свойство, которое будет принимать словарь или список ключей/значений, и заполнить форму этими значениями, сопоставляя значение элемента управления со значением ключа в словаре. И наоборот, свойство также вернет список Key/Value, соответствующий значениям элементов управления в Winform.

Это простая проблема с привязкой, или мне нужно написать собственный код? Как выглядел бы этот код?

В прошлом я достиг этого, написав класс DTO, используя сериализацию и десериализацию XML, чтобы сохранить данные класса и подключить поля формы к полям объекта DTO. Проблема состоит в том, что, поскольку форма динамически создается из внешней DLL, нет возможности «ссылаться» на этот класс DTO статически, поэтому я ищу более динамичный подход.

+1

Это было бы намного проще, если бы у вас было приложение WPF. – Bernard

ответ

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 
      } 
     } 
    } 
Смежные вопросы