C# Termine erstellen und lesen

[LA]Chris

Lt. Junior Grade
Registriert
Sep. 2012
Beiträge
282
Hey,
ich versuche eine UWP App mit Visual Studios mit einem Kalender zu erstellen, allerdings stecke ich momentan an einer Stelle fest.
Meine App ist folgendermaßen aufgebaut:
Sie besteht aus 2 Textboxen und einem Datepicker. Der Inhalt dieser soll gespeichert werden und dann in einer anderen Textbox als Termine dargestellt werden. Soweit funktioniert so auch alles, allerdings würde ich gerne mehrere Termine anlegen können und diese auch löschen können. Außerdem werden die Termine auch relativ komisch in der Textbox dargestellt.

Mein Code:

Kalender.xaml.cs

Code:
        public Kalender()
        {
         
            this.InitializeComponent();

        }

        private async void showDialog(string message)
        {
            var window = new Windows.UI.Popups.MessageDialog("Achtung", message);
            await window.ShowAsync();
        }


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

        private void SaveButton_Click(object sender, RoutedEventArgs e)
        {

            List<KalenderClass> kList = new List<KalenderClass>();
            KalenderClass k1 = new KalenderClass();
            k1.termin = TerminTextbox.Text;
            k1.datum = DatePicker1.Date;
            k1.person = PersonTextbox.Text;
            kList.Add(k1);
            SaveData(kList);
            showDialog("Daten wurden in Datei geschrieben");

        }

        private async void SaveData(List<KalenderClass> kList)
        {
            StorageFolder ordner = ApplicationData.Current.LocalFolder;
            StorageFile datei = await ordner.CreateFileAsync("Kalender.txt", CreationCollisionOption.ReplaceExisting);

            if(kList.Count != 0)
            {
                await FileIO.WriteTextAsync(datei, JsonConvert.SerializeObject(kList));
            }
        }

        private async void ReadButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder ordner = Windows.Storage.ApplicationData.Current.LocalFolder;
            StorageFile datei = await ordner.GetFileAsync("Kalender.txt");
            string inhalt = await FileIO.ReadTextAsync(datei);
            var k = JsonConvert.DeserializeObject(inhalt);
            TermineTextbox.Text = k.ToString();
        }
KalenderClass.cs:

Code:
    public class KalenderClass
    {
        public string termin { get; set; }
        public DateTimeOffset datum { get; set; }
        public string person { get; set; }


        public override string ToString()
        {
            return $"{termin} {datum} {person}";
        }
    }
Und so werden die Termine dargestellt:
kalender.png

Danke!
 
Zuletzt bearbeitet:
Benutz bitte die code tags hier im Forum, damit der code gescheit formatiert wird.
 
Hab ich jetzt gemacht, Danke dir!
 
  • Gefällt mir
Reaktionen: NJay
[LA]Chris schrieb:
Soweit funktioniert so auch alles, allerdings würde ich gerne mehrere Termine anlegen können und diese auch löschen können.
Naja, du überschreibst halt die existierenden Daten immer mit dem neuen Termin. Du müsstest den neuen Termin zu den existierenden hinzuzufügen und das dann speichern. Zum löschen wäre es hilfreich, wenn jeder Termin eine eigene ID bekommt.

[LA]Chris schrieb:
Außerdem werden die Termine auch relativ komisch in der Textbox dargestellt.
Das wird die String-Darstellung der Liste sein. Hier ein Liste oder Tabelle/Grid zu verwenden wäre wohl sinnvoller als eine Textbox.
 
Ja, das ich die Daten überschreibe ist mir bewusst, allerdings weiß ich nicht wie ich welche hinzufüge.
 
Wenn du die vorhandenen Daten einliest, hast du ja eine Liste und keinen einzelnen Eintrag. Du musst quasi Load und Save kombinieren. Alternativ merkt sich dein Programm alle Einträge als Liste.
 
Leider verstehe ich nicht so ganz wie du das meinst. Hättest du vielleicht ein Beispiel?
Ich habe jetzt die Liste aus der SaveButton Methode rausgezogen, somit werden mir mehrere Termine angezeigt. Allerdings weiß ich nicht, wie ich diese jetzt schöner darstellen kann.
 
Zuletzt bearbeitet:
Du verwendet eine Textbox zur Darstellung. Das ist doch suboptimal, es sein denn du willst das so. Löschen wird so aber sehr kompliziert. Wie schon geschrieben, solltest du wahlweise Listen oder Grids/Tabellen benutzen.
 
Danke dir erstmal!
Ich hab jetzt eine Listview wie folgt eingefügt:
Code:
        private async void ReadButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder ordner = Windows.Storage.ApplicationData.Current.LocalFolder;
            string path = ordner.Path;
            StorageFile datei = await ordner.GetFileAsync("Kalender.txt");
            string inhalt = await FileIO.ReadTextAsync(datei);
            var k = JsonConvert.DeserializeObject(inhalt);
            inhalt = k.ToString();
            TerminListview.Items.Add(inhalt);
        }
Allerdings wird ja immer die ganze Textdatei der Listview hinzugefügt und somit doppeln sich die Einträge. Und leider ist die Darstellung immer noch komisch wie auf dem Bild zu sehen ist.

kalender.png
 

Anhänge

  • kalender.png
    kalender.png
    246,5 KB · Aufrufe: 343
Du konvertierst die deserialisierte Liste in einen String und fügst diesen in die ListView, als einzelnes Item, ein. Eigentlich sollte ein Termineintrag auch als ein Item hinzugefügt werden. Sonst könntest du auch bei der Textbox bleiben.

Die Dopplung kommt daher, weil du alle Einträge ausliest und zu den bestehenden Einträgen in der Liste hinzufügst. Entweder musst du die Liste vorher leeren oder du fügst nur das neue Element ein.

Ich hab mit UWP noch nichts zu gehabt und weiß nicht, was man da für die GUI benutzt. WPF/XAML? Da wird es aber sich auch die Möglichkeit geben, eine Liste direkt an das UI-Listenobjekt zu binden. Dann brauchst du dich nicht mit Items.Add und Clear abzumühen.
 
Hast du eine Ahnung wie man nur das neue Element einfügt? Und man benutzt XAML für die GUI, allerdings hab ich keinen Plan wie man die Liste direkt an ein UI-Listenobjekt bindet.
 
[LA]Chris schrieb:
Hast du eine Ahnung wie man nur das neue Element einfügt?
Guck mal in deinem 1. Post in Zeile 28. Da machst du genau das, nur mit einer anderen Liste.

[LA]Chris schrieb:
allerdings hab ich keinen Plan wie man die Liste direkt an ein UI-Listenobjekt bindet.
Dann guck dir mal das Property DataSource und die Methode DataBind an.
 
Ja, allerdings habe ich ja keine andere Möglichkeit oder nicht? Im muss ja erst die Liste ganz serialisieren und danach ganz deserialisieren oder nicht?
 
Du könntest dir aber auch die Liste als Variable in der Kalenderklasse speichern. Alle Veränderungen werden dann in dieser Liste gemacht und diese anschließend (wieder) an die ListView gebunden und serialisiert. Nur beim Programmstart wird die Liste einmalig deserialisiert.
 
Ich habs hinbekommen! Danke dir für die Hilfe.
Trotzdem wird die Liste noch in einem komischen Format mit Klammern angezeigt, wie kann man das ändern?
 
Das komische Format ist JSON. Du musst du dem Deserializer noch die Information mitgeben, in welche Klasse er deserialisieren soll.
Code:
var k = JsonConvert.DeserializeObject<List<KalenderClass>>(inhalt);
 
Klappt jetzt, danke dir :)
Kann man das Format von DatePicker ändern? Also wie das Datum dargestellt wird.
Und wäre es möglich Personen anzulegen und diese dann in einer Art dropdown auszuwählen? Hab schon nach Tutorials gesucht aber hab bisher nichts gefunden leider.
 
[LA]Chris schrieb:
Kann man das Format von DatePicker ändern? Also wie das Datum dargestellt wird.
Die Darstellung der einzelnen Felder lässt sich anpassen: https://docs.microsoft.com/de-de/uw...ontrols.datepicker.dayformat?view=winrt-19041

[LA]Chris schrieb:
Und wäre es möglich Personen anzulegen und diese dann in einer Art dropdown auszuwählen?
Klar. Die Frage ist aber zu allgemein gehalten um da eine vernünftige Antwort drauf zu geben. Wie man Objekte erstellt, speichert und lädt weißt du ja. Hast du ein Problem mit dem DropDown? Was genau?
 
Alles klar danke dir, letze Frage noch :)
Es funktioniert nun soweit alles, ich hab allerdings noch einen Remove Button hinzugefügt der das Objekt in der ListView, aber auch in der Liste mit den Objekten löschen soll.
Hier der Code:
Code:
        private void RemoveButton_Click(object sender, RoutedEventArgs e)
        {
            if (myListView.SelectedItems.Count > 0)
            {
                myListView.Items.RemoveAt(myListView.SelectedIndex);
                kList.RemoveAt(myListView.SelectedIndex);
            }
            else
            {
                showDialog("Kein Termin ausgewählt!");
            }
        }
Mein Problem ist jetzt, dass zwar in der ListView gelöscht wird, in der Liste mit den Objekten allerdings kommt es zu einer Fehlermeldung. Ich muss allerdings irgenwie das Objekt in der Liste löschen, da der Read Button ja auf diese Liste zugreift.
 
[LA]Chris schrieb:
... allerdings kommt es zu einer Fehlermeldung.
Die da wäre? Ich sehe erst mal so keinen Fehler. Voraussetzung ist halt, dass kList identisch mit myListView.Items ist. Das kann man ja mit dem Binding erreichen.
 
Zurück
Oben