1

我敢肯定这是一个非常菜鸟的问题,但过去两个小时我一直在寻找这些信息,但真的什么也没找到。(不过,我确定我只是没有问正确的问题。)

问题是,我正在设计一个需要用户提供大量信息的应用程序,我猜它就像 14 个文本框。现在,我的问题是我不确定处理(和处理)这些信息的最佳方式是什么。

从用户那里获得所有信息后,我想将其传递给名为 SaveIt 的类,该类使用然后将其传递给 SerializeToXML,后者使用 XMLSerialize 将信息保存到 XML 文件中。但这是大量的写​​作和大量的变量要创建,我相信它可以以更优雅和更聪明的方式完成。

回顾一下:我必须将此信息传递 2 次(一次传递给 SaveIt,然后传递给 SerializeToXML),另外我必须定义一个 XMLSerialize 将使用的类,嗯……序列化它。

最聪明的方法是什么?

4

4 回答 4

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

一种方法是将原始文件Form作为参数传递。然后在您真正需要时获取信息。但是这些方法将被硬编码用于这项工作,您将无法重用它们。

那么如何使用这些变量创建一个类,并传递该类的一个实例呢?

public class TextBoxesInformation
{
    public string box1string;
    public string box2string;
    //...
}
于 2012-11-18T10:33:09.490 回答
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

一种方法是使用数据绑定。您需要将对象 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 回答