1

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

ディクショナリまたはキー/値リストを受け入れるプロパティを作成し、それらの値をフォームに入力して、コントロールの値をディクショナリのキーの値と一致させたいと考えています。逆に、このプロパティは、Winform のコントロールの値に対応する Key/Value リストも返します。

これは単純なバインドの問題ですか、それともカスタム コードを記述する必要がありますか? そのコードはどのように見えるでしょうか?

これまで、私はDTOクラスを作成し、XML シリアライゼーションとデシリアライゼーションを使用してクラスのデータを保持し、フォーム フィールドを DTO オブジェクトのフィールドに接続することでこれを実現しました。問題は、フォームが外部 DLL から動的にインスタンス化されるため、この DTO クラスを静的に「参照」する方法がないため、より動的なアプローチを探していることです。

4

1 に答える 1

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
            }
        }
    }
于 2012-03-23T03:40:32.590 に答える