2016-02-25 57 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 
     ));