2012-11-18 73 views
1

我確信這是一個非常小巧的問題,但我一直在尋找這些信息過去兩個小時,並沒有找到任何東西,真的。 (但我確信我只是沒有提出正確的問題。)從表格處理信息

事情是,我正在設計一個需要用戶提供大量信息的應用程序,我想它就像14個文本框。現在,我的問題是我不確定處理(和處理)這些信息的最佳方式是什麼。

從用戶那裏得到它後,我想將它傳遞給一個名爲SaveIt的類,然後將它傳遞給SerializeToXML,它使用XMLSerialize將信息保存到XML文件中。但這是一個很多寫作和地獄變數很多創建,我相信它可以在一個更優雅和聰明的方式完成。

回顧一下:我必須傳遞這個信息2次(一次保存,然後到SerializeToXML),再加上我必須定義一個XMLSerialize將使用的類,以及...序列化它。

什麼是做到這一點的最聰明的方法是什麼?

回答

1

一種方法是將原始的Form作爲參數。然後在你真正需要時獲得信息。但是那些方法將被硬編碼用於這項工作,並且您將無法重用它們。

那麼如何創建一個類與這些變量,並傳遞該類的一個實例?

public class TextBoxesInformation 
{ 
    public string box1string; 
    public string box2string; 
    //... 
} 
+0

雖然這是最好的方法。對我的問題來說,這可能不是一個直截了當的答案,但它指出我的想法出了什麼問題。 我希望能夠在類之間輕鬆傳遞數據。最好的辦法是創建一個類來存儲我需要的所有信息,並在開始時爲它們分配適當的值,然後重用該對象。還有很多寫作,但是當我重寫代碼時,它變成了一條走向。謝謝。 :) – moskalak

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類。

+0

的'[Serializable接口]'是不是需要XML序列化 –

+0

屬性這不是真的是我一直在尋找,但還是謝謝你提供這段代碼,它對我有一點幫助。 :) – moskalak

0

對此的一種方法是使用數據綁定。您需要添加到文本框數據綁定中,您的對象SaveIt的屬性,並且這會在用戶在文本框中寫入時自動填充您的屬性。

您可以在每個屬性的表單的構造函數中添加它。

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

,你需要實現類INotifyPropertyChanged的接口SaveIt 這樣的:

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對象

+0

這是一個不錯的方法。不過,我需要詳細瞭解數據保護。謝謝。 :) – moskalak

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>(); 
+0

是的,這是一個偉大的方式,謝謝。 :) – moskalak