DataGrid c#

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmittmuthelm.

    MrLaTuNiX schrieb:

    weil ein anderes Programm das txt Dokument ausliest

    Das andere Programm muss dann aber auch wissen, wie die Textdatei aufgebaut ist. Ist das andere Programm auch von dir?

    MrLaTuNiX schrieb:

    also ich hab den code jetzt erstmal so verändert dort :

    Ich würde hier wie gesagt die Funktionalitäten voneinander trennen.
    Mach eine Methode SaveEntries, die nur für das Speichern zuständig ist, und eine Methode InitEntries die dir dann Entries erstellt, z.B. für den Fall, dass aus der Datei keine Entries gelesen werden konnten o.ä.


    MrLaTuNiX schrieb:

    und ich müsste ja dann der combox eigentlich nur ein namen geben aber das ist wahrscheinlich falsch weil ich das über die Klasse Entry machen kann aber ich muss ehrlicherweise sagen da bin ich raus....

    Da du mit WPF arbeitest...ja, da macht man das anders. Du bindest die ItemsSource der ComboBox an Entries und das SelectedItem der ComboBox an dein Entry.SelectedItem
    Siehe Post 5, hier allerdings noch ohne SelectedItem.

    Für den generellen Umgang mit der WPF kann ich dir nur die Tutorialreihe <WPF lernen/> von @Nofear23m ans Herz legen. Absolutes Mammutprojekt und da findest du erst mal alles was du wissen musst.

    MrLaTuNiX schrieb:

    tut es mir leid wenn ich da so viel nachfrage

    Dafür ist das Forum ja da ;)


    MrLaTuNiX schrieb:

    und ich muss kurz das nachfragen weil ich das noch nie gesehen hab warum eigentlich

    C#-Quellcode

    1. private readonly string[] Wochentage = new string[] { "MO", "DI", "MI", "DO", "FR", "SA", "SO" };

    und kein Public string ?


    readonly weil wir das Array ja nicht mehr Ändern wollen.
    Was public und private angeht, da hast du vollkommen recht, mit public würde alles genauso funktionieren.
    Ich habe es nur private gemacht, da nicht ersichtlich war, dass du es aktuell woanders verwendest.
    Und wozu öffentlich sichtbar machen, wenn man es nur lokal/private benötigt?
    Dumm ist der, der dumm ist. Nicht andersrum!
    okay danke schonmal ,
    also hab das jetzt so gemacht :

    XML-Quellcode

    1. <ComboBox ItemsSource="{Binding Items }" SelectedItem="{Binding SelectedItem}"/>


    C#-Quellcode

    1. private void Button_Click(object sender, RoutedEventArgs e)
    2. {
    3. if (Entries.Any())
    4. {
    5. using (StreamWriter sw = new StreamWriter(File.Open(FilePath, FileMode.OpenOrCreate)))
    6. {
    7. var sign = TrennzeichenEntryProps;
    8. string line;
    9. sw.WriteLine("WOCHENTAG|SCHICHT|ZEIT1|ZEIT2|KOMMENTAR|SELECTED ITEM|PARAMS AUSWAHL[]\r\n");
    10. foreach (var entry in Entries)
    11. {
    12. line = $"{entry.Wochentag}{sign}{entry.Schicht}{sign}{entry.ZEIT1}{sign}{entry.ZEIT2}{sign}{entry.Comment}{sign}{(entry.Items.Any() ? $"{sign}{entry.SelectedItem}{sign}" : string.Empty)}";
    13. foreach (var item in entry.Items)
    14. {
    15. line += $"{item}{TrennzeichenEntryAuswahl}";
    16. }
    17. line = line.Remove(line.Length - TrennzeichenEntryAuswahl.Length);
    18. sw.WriteLine(line);
    19. }
    20. }
    21. }
    22. }


    C#-Quellcode

    1. public class Entry
    2. {
    3. public string Wochentag { get; set; }
    4. public string Schicht { get; set; }
    5. public TimeSpan ZEIT1 { get; set; }
    6. public TimeSpan ZEIT2 { get; set; }
    7. public ObservableCollection<string> Items { get; set; }
    8. public string SelectedItem { get; set; }
    9. public string Comment { get; set; }
    10. }


    jetzt bin ich grad aber verwirrt er speichert mit das SelectedItem nur ein wenn ich auch ein Kommentar schreibe liegt das daran wenn in Comment nichts ist das er dann einfach das garnicht übernimmt ?

    und ja das andere Programm werde ich auch schreiben :D ist halt mein kleines Projekt
    okay hab es jetzt auch nochmal so umgeändert

    C#-Quellcode

    1. if (Entries.Any())
    2. {
    3. using (StreamWriter sw = new StreamWriter(File.Open(FilePath, FileMode.OpenOrCreate)))
    4. {
    5. var sign = TrennzeichenEntryProps;
    6. string line;
    7. sw.WriteLine("WOCHENTAG|SCHICHT|ZEIT1|ZEIT2|KOMMENTAR|SELECTED ITEM|\r\n");
    8. foreach (var entry in Entries)
    9. {
    10. line = $"{entry.Wochentag}{sign}{entry.Schicht}{sign}{entry.ZEIT1}{sign}{entry.ZEIT2}{sign}{entry.SelectedItem}{sign}{entry.Comment}{sign}";
    11. line = line.Remove(line.Length - TrennzeichenEntryAuswahl.Length);
    12. sw.WriteLine(line);
    13. }
    14. }
    15. }


    weil ich die ganze Auswhl der Parameter garnicht brauch ... (Also zum speichern brauche ich die ja nicht)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MrLaTuNiX“ ()

    Gerade weil du jetzt mit Binding arbeitest, solltest du dich zunächst mal mit dem Tutorial für WPF befassen.
    Wir haben nämlich aktuell noch keine Benachrichtigungsmechanismen, Stichwort INotifyPropertyChanged.
    Änderungen, von denen du überzeugt bist, dass sie passiert sind, sind tatsächlich nicht so abgelaufen wie vielleicht gedacht.

    Kannst du das Verhalten reproduzieren? Wenn ja, beschreib bitte genau was du machst, was du erwartest was passieren soll und was aber stattdessen tatsächlich passiert.
    Sonst habe ich grade keine Möglichkeit deine Schritte nachzuvollziehen.

    Noch besser wäre es, wenn du zusätzlich das bereinigte Projekt mal als Anhang hochlädst.
    Wenn du dein Projekt hier nicht veröffentlichen willst, dann kannst du auch gerne eine abgespeckte Variante erstellen, die aber das gleiche Verhalten zeigt.

    EDIT

    Habe jetzt erst deinen Edit gesehen.
    Mit deiner geänderten Methode fürs Speichern
    Spoiler anzeigen

    C#-Quellcode

    1. if (Entries.Any())
    2. {
    3. using (StreamWriter sw = new StreamWriter(File.Open(FilePath, FileMode.OpenOrCreate)))
    4. {
    5. var sign = TrennzeichenEntryProps;
    6. string line;
    7. sw.WriteLine("WOCHENTAG|SCHICHT|ZEIT1|ZEIT2|KOMMENTAR|SELECTED ITEM|\r\n");
    8. foreach (var entry in Entries)
    9. {
    10. line = $"{entry.Wochentag}{sign}{entry.Schicht}{sign}{entry.ZEIT1}{sign}{entry.ZEIT2}{sign}{entry.SelectedItem}{sign}{entry.Comment}{sign}";
    11. line = line.Remove(line.Length - TrennzeichenEntryAuswahl.Length);
    12. sw.WriteLine(line);
    13. }
    14. }
    15. }

    passiert das, was ich in Post 19 angekündigt hab. Du bekommst Fehlerhafte Einträge in der Textdatei.

    Das Thema "Auswahl nicht speichern" ist so eine Sache. Du bindest ja die ComboBox an diese Auswahl, und Das SelectedItem der ComboBox ist an SelectedItem von Entry gebunden.
    Du speicherst jetzt die Auswahl/Items nicht mehr, willst aber beim Laden das letzte Entry.SelectedItem wieder in der ComboBox haben. Aber da du die Auswahl nicht speicherst, bleibt auch die ItemsSource der ComboBox beim laden der Daten leer. Wie willst du dann aus dieser leeren Liste ein Item auswählen?



    Dumm ist der, der dumm ist. Nicht andersrum!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schmittmuthelm“ ()

    Ich bin auch etwas verwirrt - eigentlich ging dieser Thread doch über wcf-Datagrid - richtig?

    Und nun gehts über schon 10 posts um das Lesen und Schreiben einer Liste von DatenObjekten.
    Da wundere ich mich besonders, dass das Thema Serialisierung noch nicht angesprochen wird - weil damit macht man sowas normalerweise.
    Na ja, @MrLaTuNiX wollte wissen wie er das DataGrid automatisch befüllen kann und wie er das mit einer ComboBox-Spalte hinbekommt.
    Wenn er das DataGrid beim Laden der Anwendung mit Daten aus einer Datei befüllen will, gehört Lesen und Schreiben der Datei irgendwie dazu hätte ich gesagt ?(

    Da er explizit davon gesprochen hat, das in eine einfache Textdatei zu speichern, hab ich auch nur dazu meinen Senf dazugegeben.
    Aber @ErfinderDesRades hat natürlich recht, Serialisierung wäre der richtige Weg und ich hätte das zumindest erwähnen können.
    Dumm ist der, der dumm ist. Nicht andersrum!
    Guten Morgen ,

    ja ich gib dir da auch recht @ErfinderDesRades das Thema ist wegen mir leider auch ein bisschen ausgeartet ...
    und nochmal vielen dank an @Schmittmuthelm ich probiere es dann erstmal alleine weiter :)

    @Schmittmuthelm ich muss aber eins sagen bei SelectedItem das wird gespeichert aber nur wenn ich auch ein Comment abgebe das verstehe ich halt nicht warum er das tut ?
    Wie gesagt.

    Schmittmuthelm schrieb:

    Kannst du das Verhalten reproduzieren? Wenn ja, beschreib bitte genau was du machst, was du erwartest was passieren soll und was aber stattdessen tatsächlich passiert.
    Sonst habe ich grade keine Möglichkeit deine Schritte nachzuvollziehen.

    Noch besser wäre es, wenn du zusätzlich das bereinigte Projekt mal als Anhang hochlädst.
    Dumm ist der, der dumm ist. Nicht andersrum!
    Also ich hab das Programm jetzt mal hier reingepackt und auch bereinigt. :)

    Ich versuche es jetzt mal komplett zu erklären was ich eigentlich machen will , dass hab ich ja bisher nicht getan :)
    und falls du fragen hast frag :)

    Also ich brauche zwei Programme.
    Das erste Programm (was ich jetzt hochgeladen hab): Das Programm dient als Plannung,also es soll ein Datagrid Sein wo man mit der Combox sachen auswählen kann und ein kommentar einfügen kann.Im Datagrid sind auch die Wochentage,Schichten und zwei unterschiedliche Zeiten angegeben. (Dient für das Zweite Programm), bei dem Programm ist auch zu beahten das man das Datagrid immer bearbeiten kann..zum beispiel für den nächsten tag...

    Das zweite Programm: Das Zweite Programm ist eine Anzeige, die soll so aufgebaut sein das von der Aktuellen Zeit zum Beispiel Montag 13:00 10 (Textboxen)Felder angezeigt werden mit der Combobox Auswahl und den Kommentar von dem ersten Programm und 10 Min Später solen die 10(TextBoxen)Felder wieder die Aktuellen Daten holen das heißt: Es ist Montag 13:00 item1 Kommentar: test und das wird jetzt ganz oben im Programm Gezeigt und die anderen 9 Textboxen zeigen die nächsten an, 10 min später rutscht alles 1 hoch das in der ersten textbox dann Montag 13:10 item2 Kommentar:wdasd steht und die anderen gehen halt auch ein hoch. Ist das verständlich ?
    Dateien

    Schmittmuthelm schrieb:

    Mach eine Methode SaveEntries, die nur für das Speichern zuständig ist

    Scheinbar hältst du davon nicht viel.
    Du hast bei Button_Click und Window_Closing zwei mal den selben Code. Wieso den Code nicht in eine Methode, z.B. "SaveEntries" auslagern und immer diese Methode aufrufen, anstatt jedes mal redundanten Code zu haben?

    C#-Quellcode

    1. foreach (var entry in Entries)
    2. {
    3. line = $"{entry.Wochentag}{sign}{entry.Schicht}{sign}{entry.ZEIT1}{sign}{entry.ZEIT2}{sign}{entry.SelectedItem}{sign}{entry.Comment}{sign}";
    4. line = line.Remove(line.Length - TrennzeichenEntryAuswahl.Length);
    5. sw.WriteLine(line);
    6. }


    Hier verhaust du dir wie gesagt deine Einträge der Textdatei. In deiner Variante speicherst du die Items überhaupt nicht, hast demzufolge auch kein "TrennzeichenEntryAuswahl" in der Datei. Trotzdem führst du line.Remove() aus. Du entfernst also wichtige Inhalte eines Eintrags.

    Das Thema Einträge laden hast du noch gar nicht behandelt.

    Ich habe dir mal exemplarisch was gebastelt, was sowohl deine Textdatei als auch Serialisierung behandelt.
    Der Vorteil von Serialisierung gegenüber dem selbst gebasteltem Format für die Textdatei sollte dir sofort ins Auge springen (damit meine ich nicht den Codeumfang).

    Das Speichern der Daten passiert aktuell nur beim Closing-Event. Wieso das zu Fehlern oder ungespeicherten Daten führen kann wurde in dem Thread neulich auch schon behandelt.
    Dateien
    • LaTuNix.zip

      (4,16 MB, 56 mal heruntergeladen, zuletzt: )
    Dumm ist der, der dumm ist. Nicht andersrum!