首页 > 解决方案 > 将文本框中的数据保存到本地文件中

问题描述

我正在尝试使用 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;

    }

标签: c#uwp

解决方案


的全称ApplicationDataWindows.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

问题在于DateTimeOffsetXmlSerializer目前对的支持有限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;
    }
}

谢谢。


推荐阅读