DataGrid c#

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

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

    Moin leute ,

    ich verzweifel grad beim datagrid ...

    ich will eigentlich ein nur ein datagrid erstellen mir 3 Headers
    1.Header = WOCHENTAG
    2.Header = Früh
    3.Header = da soll eine combobox rein zum auswählen
    wie mache ich das das sich das automatich erstellt ?

    bisher sieht mein code so aus ...



    C#-Quellcode

    1. public string[] wochentage = {"MO","DI","MI","DO","FR","SA","SO" };
    2. public string[] sch = {"FRÜH","SPÄT","NACHT" };
    3. public MainWindow()
    4. {
    5. InitializeComponent();
    6. DG1 dg1 = new DG1();
    7. for (int tag = 0; tag <= 6;tag ++)
    8. {
    9. for (int rtag = 0; rtag <= 5; rtag++)
    10. {
    11. dg1.h_tag = wochentage[tag];
    12. dg.Items.Add(dg1);
    13. }
    14. }
    15. for (int shift = 0; shift <= 2; shift++)
    16. {
    17. for (int rshift = 0; rshift <= 47; rshift++)
    18. {
    19. dg1.h_shift = sch[shift];
    20. dg.Items.Add(dg1);
    21. }
    22. }
    23. }
    24. public class DG1
    25. {
    26. public string h_tag { get; set; }
    27. public string h_shift { get; set; }
    28. }



    allerdings kriege ich nur von den Schleifen die letzten tage raus so wie die letzt schicht... und wie ich die Comboxauswahl in die Dritte reihe bekomme weiß ich auch nocht nicht kann mir da jemand helfen ?
    In der ersten Spalte sollen nur Wochentage stehen und in der zweiten nur die Schichten richtig?
    Und was willst du mit der ComboBox auswählen?

    Deine Schleifen verstehe ich auch noch nicht so ganz ?(

    MrLaTuNiX schrieb:

    C#-Quellcode

    1. for (int shift = 0; shift <= 2; shift++)
    2. {
    3. for (int rshift = 0; rshift <= 47; rshift++)
    4. {
    5. dg1.h_shift = sch[shift];
    6. dg.Items.Add(dg1);
    7. }
    8. }


    Wozu dient die innere Schleife? Du verwendest ja rshift nirgends. Das selbe gilt für rtag .
    Das ganze führt ja nur dazu, dass du dg.Items mehrfach dein dg1 mit gleichem Wert für h_shift hinzufügst
    Dumm ist der, der dumm ist. Nicht andersrum!

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

    Genau Richtig .
    also ich hab dei zweite schleife genommen damit zum beispiel Montag 6 mal hintereinander kommt :)
    und bei der der anderen schleife das selbe das heißt das soll zwei mal früh zwei mal spät zweimal nacht kommen :)
    hab grad aber gemkert das ich da die zahlen falsch eingesetzt hab so müsste das aussehen

    C#-Quellcode

    1. for (int tag = 0; tag <= 6;tag ++)
    2. {
    3. for (int rtag = 0; rtag <= 6; rtag++)
    4. {
    5. dg1.h_tag = wochentage[tag];
    6. list.Items.Add(wochentage[tag]);
    7. dg.Items.Add(dg1);
    8. }
    9. }
    10. for (int shift = 0; shift <= 2; shift++)
    11. {
    12. for (int rshift = 0; rshift <= 2; rshift++)
    13. {
    14. dg1.h_shift = sch[shift];
    15. dg.Items.Add(dg1);
    16. }
    17. }


    und wenn ich halt 40 mal montag schreiben muss und die anderen tage auch kann ich das halt ganz einfach ädnern :)
    aber meine wichtigste frage ist halt wie das ins datagrid kommt weil so erhalte ich nur Sonntag und nacht immer ....

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

    @MrLaTuNiX Lerne zu debuggen: Debuggen, Fehler finden und beseitigen
    Setz nen Haltepunkt drauf und teste Deinen Code, ob er das tut, was er tun soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Spricht was dagegen, dass du dir einen eigenen Typ für einen Eintrag machst und dann eine Auflistung dieser Einträge erstellst?
    In etwa so
    Spoiler anzeigen

    C#-Quellcode

    1. public partial class MainWindow : Window
    2. {
    3. public MainWindow()
    4. {
    5. InitializeComponent();
    6. DataContext = this;
    7. }
    8. public ObservableCollection<Entry> Entries { get; set; } = new ObservableCollection<Entry>
    9. {
    10. new Entry { Wochentag = "MO", Schicht = "FRÜH", Auswahl = new ObservableCollection<object> { 1, "MO FRÜH", "irgendwas"} },
    11. new Entry { Wochentag = "DI", Schicht = "SPÄT", Auswahl = new ObservableCollection<object> { 1, "DI SPÄT", "was anderes"} },
    12. new Entry { Wochentag = "DO", Schicht = "NACHT", Auswahl = new ObservableCollection<object> { 1, "DO NACHT", "hallo"} },
    13. new Entry { Wochentag = "FR", Schicht = "FRÜH", Auswahl = new ObservableCollection<object> { 1, "FR FRÜH", false} },
    14. };
    15. }
    16. public class Entry
    17. {
    18. public string Wochentag { get; set; }
    19. public string Schicht { get; set; }
    20. public ObservableCollection<object> Auswahl { get; set; }
    21. }


    XML-Quellcode

    1. <Window ...
    2. ...>
    3. <Grid>
    4. <DataGrid ItemsSource="{Binding Entries}" AutoGenerateColumns="False">
    5. <DataGrid.Columns>
    6. <DataGridTextColumn Header="WOCHENTAG" Binding="{Binding Wochentag}"/>
    7. <DataGridTextColumn Header="SCHICHT" Binding="{Binding Schicht}"/>
    8. <DataGridTemplateColumn Header="AUSWAHL">
    9. <DataGridTemplateColumn.CellTemplate>
    10. <DataTemplate>
    11. <ComboBox ItemsSource="{Binding Auswahl}"/>
    12. </DataTemplate>
    13. </DataGridTemplateColumn.CellTemplate>
    14. </DataGridTemplateColumn>
    15. </DataGrid.Columns>
    16. </DataGrid>
    17. </Grid>
    18. </Window>



    Ich weiß allerdings immer noch nicht so genau, was du eigentlich vor hast, also was du mit den Daten planst.

    Was dein

    MrLaTuNiX schrieb:

    so erhalte ich nur Sonntag und nacht immer

    angeht...schau dir mal die Instanz an und was du eigentlich dem dg.Items hinzufügst. Stichwort Debuggen, Fehler finden und beseitigen wie bereits von RfG erwähnt
    Dumm ist der, der dumm ist. Nicht andersrum!

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

    MrLaTuNiX schrieb:

    also mit meiner schleife wie geht denn die andere schleife ?
    Lerne zu debuggen!
    DataGrid c#
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    okay also ich verusche es nochmal besser zu erklären was ich eigentlich haben möchte in meinen Datagrid :
    Spallte1 Spallte2 Spallte3
    MO FRÜH combobox
    MO FRÜH combobox
    MO FRÜH combobox
    MO FRÜH combobox
    MO spät combobox
    MO spät combobox
    MO spät combobox
    MO nacht combobox
    MO nacht combobox
    MO nacht combobox
    DI Früh combobox
    ......
    SO Nacht combobox


    und das will ich als Schleife ins Datagrid reinbekommen und nicht so :

    C#-Quellcode

    1. public ObservableCollection<Entry> Entries { get; set; } = new ObservableCollection<Entry>
    2. {
    3. new Entry { Wochentag = "MO", Schicht = "FRÜH", Auswahl = new ObservableCollection<object> { 1, "MO FRÜH", "irgendwas"} },
    4. new Entry { Wochentag = "DI", Schicht = "SPÄT", Auswahl = new ObservableCollection<object> { 1, "DI SPÄT", "was anderes"} },
    5. new Entry { Wochentag = "DO", Schicht = "NACHT", Auswahl = new ObservableCollection<object> { 1, "DO NACHT", "hallo"} },
    6. new Entry { Wochentag = "FR", Schicht = "FRÜH", Auswahl = new ObservableCollection<object> { 1, "FR FRÜH", false} },
    7. };


    sonst wäre das ja viel zu viel code und das war es auch eigentlich schon ...

    also verstehst du was ich meine ? @Schmittmuthelm


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

    So wie du hier

    MrLaTuNiX schrieb:

    C#-Quellcode

    1. for (int tag = 0; tag <= 6;tag ++)
    2. {
    3. for (int rtag = 0; rtag <= 5; rtag++)
    4. {
    5. dg1.h_tag = wochentage[tag];
    6. dg.Items.Add(dg1);
    7. }
    8. }

    deine Schleifen durch gehst, kannst du doch auch Schleifen machen, um ObservableCollection<Entry> Entries Items hinzuzufügen.

    Ungefähr so

    C#-Quellcode

    1. private readonly string[] Wochentage = new string[] { "MO", "DI", "MI", "DO", "FR", "SA", "SO" };
    2. private readonly string[] Schichten = new string[] { "FRÜH", "SPÄT", "NACHT" };
    3. private void InitEntries()
    4. {
    5. int anzahlWiederholung = 4;
    6. foreach (var tag in Wochentage)
    7. {
    8. foreach (var schicht in Schichten)
    9. {
    10. for (int i = 0; i < anzahlWiederholung; i++)
    11. {
    12. Entries.Add(new Entry { Wochentag = tag, Schicht = schicht, Auswahl = new ObservableCollection<object> { "Evtl. meine Auswahl für die ComboBox" } });
    13. }
    14. }
    15. }
    16. }


    Ob du die Property Auswahl von Entry überhaupt für deine ComboBox in Spalte 3 brauchst weiß ich nicht. Mir ist nämlich immer noch nicht klar, was du eigentlich in der ComboBox auswählen willst.
    Aber rein um wiederholt Wochentage mit entsprechender Schicht zu adden, sollte das erst mal so gehen.
    Dumm ist der, der dumm ist. Nicht andersrum!
    okay das klappt jetzt alles wie ich es haben möchte danke dir :)
    übrigens sieht mein code jetzt so aus :

    Spoiler anzeigen

    C#-Quellcode

    1. public partial class MainWindow : System.Windows.Window
    2. {
    3. private readonly string[] Wochentage = new string[] { "SO", "MO", "DI", "MI", "DO", "FR", "SA", "SO" };
    4. private readonly string[] Schichten = new string[] { "FRÜH", "SPÄT", "NACHT" };
    5. public TimeSpan zeit1 = new TimeSpan(21,00,00);
    6. public TimeSpan zeit2 = new TimeSpan(22, 00, 00);
    7. public MainWindow()
    8. {
    9. InitializeComponent();
    10. DataContext = this;
    11. InitEntries();
    12. }
    13. public ObservableCollection<Entry> Entries { get; set; } = new ObservableCollection<Entry>
    14. {
    15. };
    16. private void InitEntries()
    17. {
    18. int anzahlWiederholung = 18;
    19. foreach (var tag in Wochentage)
    20. {
    21. foreach (var schicht in Schichten)
    22. {
    23. for (int i = 0; i < anzahlWiederholung; i++)
    24. {
    25. Entries.Add(new Entry { Wochentag = tag, Schicht = schicht, ZEIT1 = zeit1, ZEIT2 = zeit2, Auswahl = new ObservableCollection<object> { "test1","test2" } });
    26. zeit1 += TimeSpan.FromMinutes(10);
    27. zeit2 += TimeSpan.FromMinutes(10);
    28. if (zeit1 == new TimeSpan(1,00,00,00))
    29. {
    30. zeit1 = new TimeSpan(00, 00, 00);
    31. }
    32. if (zeit2 == new TimeSpan(1, 00, 00, 00))
    33. {
    34. zeit2 = new TimeSpan(00, 00, 00);
    35. }
    36. }
    37. }
    38. }
    39. }
    40. public class Entry
    41. {
    42. public string Wochentag { get; set; }
    43. public string Schicht { get; set; }
    44. public TimeSpan ZEIT1 { get; set; }
    45. public TimeSpan ZEIT2 { get; set; }
    46. public ObservableCollection<object> Auswahl { get; set; }
    47. }
    48. private void Button_Click(object sender, RoutedEventArgs e)
    49. {
    50. }
    51. }


    ich glaube ich hab allerdings grad ein fehler gemacht weil ich die daten alle in einer txt datei speichern soll und das geht so nicht richtig ? ich müsste nämlich eine Datatable einfügen richtig ?
    okay hab das auch hinbekommen so schwer war das dann doch nicht ... :)
    aber mal ne andere frage also wenn ich jetzt mein programm öffnen will soll er erst die text datei lesen und dann automatisch die combox füllen mit test1 test2 oder garnichts wie es als letztes abgespeichert wurde geht das ?

    C#-Quellcode

    1. private void InitEntries()
    2. {
    3. StreamWriter sw = new StreamWriter(pathtxt);
    4. int anzahlWiederholung = 18;
    5. foreach (var tag in Wochentage)
    6. {
    7. foreach (var schicht in Schichten)
    8. {
    9. for (int i = 0; i < anzahlWiederholung; i++)
    10. {
    11. Entries.Add(new Entry { Wochentag = tag, Schicht = schicht, ZEIT1 = zeit1, ZEIT2 = zeit2, Auswahl = new ObservableCollection<object> { "test1","test2" } });
    12. zeit1 += TimeSpan.FromMinutes(10);
    13. zeit2 += TimeSpan.FromMinutes(10);
    14. if (zeit1 == new TimeSpan(1,00,00,00))
    15. {
    16. zeit1 = new TimeSpan(00, 00, 00);
    17. }
    18. if (zeit2 == new TimeSpan(1, 00, 00, 00))
    19. {
    20. zeit2 = new TimeSpan(00, 00, 00);
    21. }
    22. sw.WriteLine(tag.ToString() + schicht.ToString() + zeit1.ToString() + zeit2.ToString());
    23. }
    24. }
    25. }
    26. sw.Close();
    27. }


    also schreibe ich ja alle sachen in einer text datei bis auf die combobox grad und genau da liegt mein problem wie ich die auch schreiben oder lesen kann ?
    Also zunächst mal ist der Methodenname nicht mehr passend für das, was du vor hast. Du willst ja deine Einträge speichern und nicht initialisieren.

    Du schreibst zwar alles in eine Textdatei, und das funktioniert so auch. Aber mit Hinblick auf das Auslesen klappt das in deinem "Format" nicht, oder nur unnötig umständlich und nicht wirklich sauber.
    Du könntest dir ein Trennzeichen für die einzelnen Properties einfügen, um dann beim Auslesen die Zeilen an dem Trennzeichen zu splitten und den richtigen Properties zuzuweisen.
    Für die Items in Entry.Auswahl kannst du dir auch ein separates Trennzeichen machen, um diese Auflistung dann auch sauber zu splitten.
    Das könnte dann so aussehen
    Spoiler anzeigen

    C#-Quellcode

    1. private const string FilePath = "MeineEinträge.txt";
    2. private const string TrennzeichenEntryAuswahl = "$#*";
    3. private const string TrennzeichenEntryProps = "|";
    4. private void SaveEntries()
    5. {
    6. if (Entries.Any())
    7. {
    8. using (StreamWriter sw = new StreamWriter(File.Open(FilePath, FileMode.OpenOrCreate)))
    9. {
    10. var sign = TrennzeichenEntryProps;
    11. string line;
    12. sw.WriteLine("WOCHENTAG|SCHICHT|ZEIT1|ZEIT2|PARAMS AUSWAHL[]\r\n");
    13. foreach (var entry in Entries)
    14. {
    15. line = $"{entry.Wochentag}{sign}{entry.Schicht}{sign}{entry.Zeit1}{sign}{entry.Zeit2}{(entry.Auswahl.Any() ? $"{sign}" : string.Empty)}";
    16. foreach (var item in entry.Auswahl)
    17. {
    18. line += $"{item}{TrennzeichenEntryAuswahl}";
    19. }
    20. line = line.Remove(line.Length - TrennzeichenEntryAuswahl.Length);
    21. sw.WriteLine(line);
    22. }
    23. }
    24. }
    25. }


    Die Methode SaveEntries kannst du dann z.B. beim Schließen der Anwendung oder auch immer wenn sich ein Eintrag ändert aufrufen.

    Das Laden übernimmt dann eine Methode LoadEntries in der du die Textdatei ausliest, an den festgelegten Trennzeichen splittest und den entsprechenden Properties zuweist. Beim Laden musst du darauf achten, dass es durchaus sein kann, dass die Datei gar nicht vorhanden ist. Solche Fälle musst du auch behandeln und entscheiden was zu tun ist.
    Dumm ist der, der dumm ist. Nicht andersrum!
    Du könntest mir auch endlich mal verraten, was du mit der ComboBox eigentlich genau vor hast ;)

    Aber das hat mit deinem Problem nichts zutun. Wenn du das grade ausgewählte Item auch mit speichern willst, legen wir in Entry noch eine Property dafür an und speichern die dann einfach mit.
    Dann sieht die Klasse Entry so aus

    C#-Quellcode

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


    Und dein Speichern im MainWindow so

    C#-Quellcode

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


    Dafür zu sorgen, dass SelectedItem ein Item aus Items ist, überlass ich erst mal dir.

    EDIT:
    Beim Speichern kann es aktuell auch noch unter bestimmten Umständen dazu kommen, dass man sich einen "Datensatz" verhaut.
    Die Stelle kannst du auch noch eigenständig ausbessern.

    Dumm ist der, der dumm ist. Nicht andersrum!

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

    Also die Combox ist dafür da das man halt eine bestimmte sache auswählen kann , es ist nacher für ein Plannung da :) weil ein anderes Programm das txt Dokument ausliest und dann halt sich die auswahl ausließt und das dann halt visualliesiert :) deshalb pack ich die rein :)

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

    C#-Quellcode

    1. private void InitEntries()
    2. {
    3. StreamWriter sw = new StreamWriter(pathtxt);
    4. int anzahlWiederholung = 18;
    5. foreach (var tag in Wochentage)
    6. {
    7. foreach (var schicht in Schichten)
    8. {
    9. for (int i = 0; i < anzahlWiederholung; i++)
    10. {
    11. Entries.Add(new Entry { Wochentag = tag, Schicht = schicht, ZEIT1 = zeit1, ZEIT2 = zeit2,Items = new ObservableCollection<string> { cmb_items[0],cmb_items[1],cmb_items[2] } });
    12. zeit1 += TimeSpan.FromMinutes(10);
    13. zeit2 += TimeSpan.FromMinutes(10);
    14. if (zeit1 == new TimeSpan(1,00,00,00))
    15. {
    16. zeit1 = new TimeSpan(00, 00, 00);
    17. }
    18. if (zeit2 == new TimeSpan(1, 00, 00, 00))
    19. {
    20. zeit2 = new TimeSpan(00, 00, 00);
    21. }
    22. sw.WriteLine(tag.ToString() + schicht.ToString() + zeit1.ToString() + zeit2.ToString());
    23. }
    24. }
    25. }
    26. sw.Close();
    27. }
    28. public class Entry
    29. {
    30. public string Wochentag { get; set; }
    31. public string Schicht { get; set; }
    32. public TimeSpan ZEIT1 { get; set; }
    33. public TimeSpan ZEIT2 { get; set; }
    34. public ObservableCollection<string> Items { get; set; }
    35. public string SelectedItem { get; set; }
    36. }

    C#-Quellcode

    1. private readonly string[] cmb_items = new string[] { "test1", "test2", "test3" };


    und das mit dem SelectedItem ist ja ansich nur ein String kenne das eigentlich nur das man das so macht von der combobox :

    sw.WriteLine(cmb.Text.ToString());

    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....

    kurz zu mir warum ich nicht so gut bin Studiere Software Engeeniering C# aber hab grad angefangen und versuche es mir neben noch so zu lernen mit kleinen Programmen deswegen.. tut es mir leid wenn ich da so viel nachfrage ...
    aber bisher was du mir geschickt hast hab ich auch verstanden und danke dir dafür auch :) ich glaube manche würden nicht so viel Antworten mit lösungen :)

    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 ?
    also ich gehe jetzt mal davon aus das du dass gemacht hast weil ich mit den Strings nichts mehr mache außer zu lesen und die sich nicht ändern aber nur für mein verstädnis mit einen public string wäre das selbe gewesen richtg ?


    EDIT: Sorry hab grad gemerkt das ich auch noch in der anderen text datei die sachen reinschreibe packe die natürlich raus

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