2012-03-23 15 views
1

構成UIで使用するために外部フォームオブジェクトを動的にインスタンス化するWinformsアプリケーションがあります。各動的にインスタンス化されたフォームはTabPageに配置されます。辞書またはキー/値リストにWinformをバインドする

ディクショナリまたはキー/値のリストを受け入れるプロパティを作成し、コントロールの値をディクショナリのKeyの値と照合して、これらの値をフォームに取り込みたいとします。逆に、このプロパティは、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 
      } 
     } 
    } 
関連する問題