2016-02-25 74 views
1

好了,所以我認爲我可以很容易地實現這一目標,但現在很清楚我錯過了一些很大的東西。保存一個對象列表到TXT文件

我有一個名爲Oggetto類,Oggetto有一個公共字符串諾姆{獲取;集;}和公用字符串Descrizione {獲取;集;}

這些被綁定到一個文本框在DataGrid中的單元格這樣

<DataGridTemplateColumn Header="Nome" MinWidth="60"> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate DataType="{x:Type local:Oggetto}"> 
              <TextBox Text="{Binding Nome}"/> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 
           <DataGridTemplateColumn Header="Descrizione" MinWidth="100"> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate DataType="{x:Type local:Oggetto}"> 
              <TextBox Text="{Binding Descrizione}" TextWrapping="Wrap" /> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 

在一個按鈕的點擊我添加一個空對象到我先前聲明如下

List<Oggetto> oggetti = new List<Oggetto>(); 

添加方法Oggetto的列表執行此

private void btn_AggOgg_Click(object sender, RoutedEventArgs e) 
    { 
     oggetti.Add(new Oggetto() { }); 

     dg_Misc.ItemsSource = oggetti; 
     dg_Misc.Items.Refresh(); 

     dg_Misc.Columns[1].Width = new DataGridLength(1, DataGridLengthUnitType.Star); 
     dg_Misc.CanUserResizeRows = false; 
    } 

我也有這是否對另一個按鈕

public void Salvataggio() 
    { 
     StreamWriter sw = new StreamWriter("MiscSave"); 

     foreach(Oggetto oggetto in oggetti) 
     { 
      sw.WriteLine(oggetti); 
     } 

     sw.Close(); 
    } 

的點擊保存方法和我的問題是文件MiscSave.txt都是完全空白。 我嘗試了幾種解決方案,我發現這裏和那裏,但我似乎無法讓他們爲我工作。

例如,我甚至不知道將oggetto.Descrizione綁定到TextBlock是否會在更改內部寫入內容時發生更改。 我想過像

oggetto.Nome = oggetti[0].Text 

但即使在我的腦海它沒有很大的意義。

我也不會說英語作爲我的主要語言,所以我提前對我犯的任何錯誤感到抱歉,隨時指出它們,但大多可以隨意指出我的理解中的漏洞,將列表保存爲txt文件。

+0

我試着改變sw.WriteLine(oggetti); line to sw.WriteLine(oggetto.Nome +';'+ oggetto.Descrizione); 但沒有任何變化 –

+0

感謝大家的幫助,不喜歡我切換到數據庫的txt選項。 –

回答

0

在您保存方法:

sw.WriteLine(oggetti);

你試圖Oggetto類型的自定義對象的整個列表保存到文本文件中的一行。

這是不行的,因爲WriteLine方法需要一個字符串作爲參數。

喜歡的東西: sw.WriteLine(oggetto.Nome); 可能會工作,只要Nomestring型。

通過這種方式,您可以訪問Oggetto對象列表中每個項目的字符串屬性。不是整個集合(List)一次。

0

您也可以嘗試使用DataContractSerializer來序列化類型。以下代碼應該將對象序列化爲一個文件。

FileStream writer = new FileStream(fileName, FileMode.Create); 
DataContractSerializer ser = new DataContractSerializer(typeof(List<Oggetto>)); 
ser.WriteObject(writer, oggetti); 
writer.Close(); 
1

同樣,我會建議通過XML或序列號或東西這樣做。這將有助於您讀迴文件。 但是,請嘗試以下方法:文件。WriteAllLines

下面是MSDN鏈接和示例。
https://msdn.microsoft.com/en-us/library/dd383693%28v=vs.110%29.aspx 您將需要提供保存文件路徑的方法以及要保存的字符串的集合。您可能需要從您的Ogetta或其他任何集合中進行另一個集合,或者爲該集合執行for循環,並在將其傳遞給File.WriteAllText方法之前插入字符串屬性等。

0

我同意Theo,即使可以使用序列化。否則只是做這樣的事情:

File.WriteAllLines("MiscSave", oggetti.Select(o => 
      o.Nome + " " + o.Descrizione 
     ));