将数据从文本框保存到本地文件

时间:2020-06-21 13:39:25

标签: c# uwp

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

    }

2 个答案:

答案 0 :(得分:1)

ApplicationData的全名是Windows.Storage.ApplicationData

如果只想输入ApplicationData,则需要在文件头中添加对命名空间的引用:

using Windows.Storage;

...

var localFolder = ApplicationData.Current.LocalFolder;

如果您想知道保存的文件路径,可以使用以下代码:

var localFolder = ApplicationData.Current.LocalFolder;
string path = localFolder.Path;

您可以在调试过程中中断程序并检查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;
    }
}

Update2

问题出在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;
    }
}

谢谢。

答案 1 :(得分:0)

Kalender.xaml.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Storage;

// Die Elementvorlage "Leere Seite" wird unter https://go.microsoft.com/fwlink/?LinkId=234238 dokumentiert.

namespace Studienarbeit
{
    /// <summary>
    /// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann.
    /// </summary>
    public sealed partial class Kalender : Page
    {
        
        //List<KalenderClass> ls;


        public Kalender()
        {
            
            this.InitializeComponent();

        }

        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 showDialog(string message)
        {
            var window = new Windows.UI.Popups.MessageDialog("Achtung", message);
            await window.ShowAsync();
        }

        private void ButtonStartseite_Copy_Click(object sender, RoutedEventArgs e)
        {

        }

        private void ButtonStartseite_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(MainPage));
        }

        private void TerminTextBlock_SelectionChanged(object sender, RoutedEventArgs e)
        {

        }

        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);
            showDialog("Daten wurden in Daten geschrieben");

        }


        private async void ReadButton_Click(object sender, RoutedEventArgs e)
        {
            var data = await GetDataFromLocalFile();
            TerminTextBlock.Text = data.Termin;

        }

        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;
            }
        }

        private void TerminTextbox_TextChanged(object sender, TextChangedEventArgs e)
        {

        }
    }
}

KalenderClass.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;

namespace Studienarbeit
{
    public class KalenderClass
    {
        public string Termin { get; set; }
        public DateTimeOffset Datum { get; set; }
        public string Person { get; set; }
    }
}
相关问题