1

これは非常に初歩的な質問だと思いますが、この情報を過去 2 時間探していましたが、実際には何も見つかりませんでした。(ただし、正しい質問をしなかったと確信しています。)

問題は、ユーザーが多くの情報を提供する必要があるアプリケーションを設計していることです。14 個の TextBox のようなものだと思います。さて、私の問題は、この情報を処理 (および処理) する最善の方法がわからないことです。

ユーザーからすべてを取得した後、それを SaveIt というクラスに渡し、SerializeToXML に渡します。SerializeToXML は、XMLSerialize を使用して情報を XML ファイルに保存します。しかし、それは非常に多くの記述と作成する非常に多くの変数であり、よりエレガントでスマートな方法で実行できると確信しています。

要約すると、この情報を 2 回 (SaveIt に 1 回、次に SerializeToXML に) 渡す必要があり、さらに XMLSerialize が使用するクラスを定義する必要があります。

それを行う最も賢い方法は何ですか?

4

4 に答える 4

1

Form1 つの方法は、オリジナルをパラメーターとして渡すことです。そして、本当に必要なときに情報を入手してください。ただし、これらのメソッドはこのジョブ用にハードコーディングされ、再利用できなくなります。

では、これらの変数を使用してクラスを作成し、そのクラスのインスタンスを渡すのはどうでしょうか?

public class TextBoxesInformation
{
    public string box1string;
    public string box2string;
    //...
}
于 2012-11-18T10:33:09.490 に答える
1

SaveIt クラスをシリアライズ可能にする必要があります。XML シリアライザーはプロパティのみを保存します。

[Serializable]
public class SaveIt
{
    public string Text1 {get; set;}
    public string Text2 {get; set;}
    ...
}

private void Save(string filename)
{
    SaveIt save = new SaveIt();
    save.Text1 = textBox1.Text;
    ...

    using(Stream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Write))
    {
        XmlSerializer xmlserializer = new XmlSerializer( typeof(SaveIt) );
        xmlserializer.Serialize( stream, save );
    }
}

private void Load(string filename)
{
    SaveIt load;
    using(Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        XmlSerializer xmlserializer = new XmlSerializer( typeof(SaveIt) );
        load = xmlserializer.Deserialize(stream) as SaveIt;
    }

    textBox1.Text = load.Text1;
    textBox2.Text = load.Text2;
    ...
}

残念ながら、フォームから SaveIt クラスにデータをコピーする簡単な方法はありません。

于 2012-11-18T09:48:37.963 に答える
1

私はすでに回答を書いていますが、おそらくあなたの質問の要点は異なっていたので、質問の別の側面に対する回答をここに示します。

おそらく次のようなものです:

foreach (Control ctrl in Controls)
    if (ctrl is TextBox)
        dictionary.Add((ctrl as TextBox), (ctrl as TextBox).Text);

どこ:

Dictionary<TextBox, string> dictionary = new Dictionary<TextBox, string>();
于 2012-11-18T10:50:47.740 に答える
0

これに対する 1 つのアプローチは、データバインディングを使用することです。テキスト ボックス データ バインディング、オブジェクト SaveIt のプロパティに追加する必要があります。これにより、ユーザーがテキスト ボックスに書き込むと、プロパティが自動的に入力されます。

これは、すべてのプロパティのフォームのコンストラクターに追加できます。

SaveIt saveIt = new SaveIt();
textBoxFirstName.DataBindings.Add("Text", saveIt.FirstName, "FirstName");
textBoxLastName.DataBindings.Add("Text", saveIt.LastName, "LastName");

次のように、クラス SaveIt にインターフェイス INotifyPropertyChanged を実装する必要があります。

public class SaveIt : INotifyPropertyChanged {


    public event PropertyChangedEventHandler PropertyChanged;

    private string _firstName = string.Empty;
    private string _lastName = string.Empty;

    public string FirstName {
        get { return _firstName; }
        set {
            _firstName = value;
            OnPropertyChanged("FirstName");
        }
    }

    public string LastName {
        get { return _lastName; }
        set {
            _lastName = value;
            OnPropertyChanged("LastName");
        }
    }

    private void OnPropertyChanged(string propertyName) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

これを使用すると、すべてのプロパティを手動で入力する必要はありません

次に、Casperah のアプローチを使用して、SaveIt オブジェクトをシリアル化できます。

于 2012-11-18T10:23:33.167 に答える