c# - 将文本框中的数据保存到本地文件中
问题描述
我正在尝试使用 Visual Studio 创建一个 UWP 应用程序,它将 2 个文本框和 1 个 DatePicker 保存并读取到文件中,但我不知道该怎么做。保存数据现在应该可以工作了,这是我的方法:
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
TextWriter writer = new StreamWriter(stream.AsStream());
serializer.Serialize(writer, data);
}
}
这是我的安全按钮的样子:
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass kc = new KalenderClass();
kc.Termin = TerminTextBlock.Text;
kc.Person = PersonTextBlock.Text;
kc.Datum = DatePicker1.Date;
await SaveDataInLocalFile(kc);
}
这就是我的阅读按钮的样子:
private async void ReadButton_Click(object sender, RoutedEventArgs e)
{
var data = await GetDataFromLocalFile();
TerminTextBlock.Text = data.Termin;
}
现在的问题是xml文件被序列化了,我不知道如何反序列化ist。
新的保存和读取方法:
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
TerminTextbox.Text = localFolder.Path;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
serializer.WriteObject(stream.AsStreamForWrite(), data);
}
}
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.ReadObject(stream.AsStream()) as KalenderClass;
return data;
}
}
保存和阅读按钮:
private async void SaveButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass kc = new KalenderClass();
kc.Termin = TerminTextbox.Text;
kc.Person = PersonTextbox.Text;
kc.Datum = DatePicker1.Date;
await SaveDataInLocalFile(kc);
showDialog("Daten wurden in Daten geschrieben");
}
private async void ReadButton_Click(object sender, RoutedEventArgs e)
{
KalenderClass data = await GetDataFromLocalFile();
PersonTextbox.Text = data.Termin;
}
解决方案
的全称ApplicationData
是Windows.Storage.ApplicationData
。
如果只想输入ApplicationData
,则需要在文件头中添加对命名空间的引用:
using Windows.Storage;
...
var localFolder = ApplicationData.Current.LocalFolder;
如果您想知道保存的文件路径,可以使用以下代码:
var localFolder = ApplicationData.Current.LocalFolder;
string path = localFolder.Path;
您可以在调试期间中断程序并检查路径的值。
更新
反序列化方法
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
XmlSerializer serializer = new XmlSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.Deserialize(stream.AsStream()) as KalenderClass;
return data;
}
}
更新2
问题在于DateTimeOffset
,XmlSerializer
目前对的支持有限DateTimeOffset
,可以考虑使用DataContractSerializer
代替XmlSerializer
。
public async Task SaveDataInLocalFile(KalenderClass data)
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.ReadWrite))
{
serializer.WriteObject(stream.AsStreamForWrite(), data);
}
}
public async Task<KalenderClass> GetDataFromLocalFile()
{
var localFolder = ApplicationData.Current.LocalFolder;
var dataFile = await localFolder.CreateFileAsync("DataFile.xml", CreationCollisionOption.OpenIfExists);
DataContractSerializer serializer = new DataContractSerializer(typeof(KalenderClass));
using (var stream = await dataFile.OpenAsync(FileAccessMode.Read))
{
var data = serializer.ReadObject(stream.AsStream()) as KalenderClass;
return data;
}
}
谢谢。
推荐阅读
- python - python kubernetes watch 崩溃
- elasticsearch - 如何为 K8s 上的 Elasticsearch 部署应用配置?
- asp.net-web-api - 自定义操作过滤器(带有依赖项)在 ASP.NET Core 3.1 Web API 中不起作用
- reactjs - 有没有办法让上下文仅在其数据更改时重新渲染?
- javascript - Visual Studio 2019 粘贴代码时添加属性
- firebase - Vue应用程序中的Firebase登录页面刷新
- python - 如果在 groupby 结果中大于 0,则计算列的值
- python - 我应该为“操作当前无效”提出什么异常?
- r - 不知道如何编写正则表达式
- prism - 找不到 Prism.PrismApplication