Laden...

Wie ändere ich den Inhalt einer Zelle in einer WPF Tabelle im FlowDocument?

Erstellt von TigerCrow vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.020 Views
T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 5 Jahren
Wie ändere ich den Inhalt einer Zelle in einer WPF Tabelle im FlowDocument?

Hallo Zusammen 🙂

ich mal wieder 😭

Habe ein kleines (Großes) Problem mit einer Tabelle im FlowDocument. Wobei das FlowDocument kein Problem ist, aber die Tabelle 🙁

die Tabelle sieht gerade so aus wie im Anhang. Passt auch ersteinmal so 🙂

Jetzt aber möchte ich einen Zelleninhalt an Stelle x ändern .. Hintergrundfarbe geht! Aber wie der Inhalt???

Hier mal das komplette Script:


using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;

namespace DozentenZeit.Seiten
{
    /// <summary>
    /// Interaktionslogik für Tabelle.xaml
    /// </summary>
    public partial class Tabelle : Page
    {
        public Tabelle()
        {
            InitializeComponent();
        }


        Zeiten HoleZeiten = new Zeiten();
        public List<string> DozThemen = new List<string>();
        Global GL = new Global();

        MitarbeiterVerwaltung mv = new MitarbeiterVerwaltung();
        List<Mitarbeiter> ausg = new List<Mitarbeiter>();
        List<List<DateTime>> UnterichtsZeiten = new List<List<DateTime>>();

        private void Tester_Loaded(object sender, RoutedEventArgs e)
        {
            
            // DozentenZeiten Lesen
            mv.Load(GL.Dateipfad);
            ausg = mv.Auslesen();

            // Liste mit datumsangaben füllen für jeden dozenten

            for (int Dozent = 0; Dozent < ausg.Count; Dozent++)
            {
                UnterichtsZeiten.Add(new List<DateTime>());
                int AnzahlDoz = ausg[Dozent].UnterZeiten.Count;
                for (int u = 0; u < AnzahlDoz; u++)
                {
                    int Tage = HoleZeiten.TageZwischenZweiDatumsangaben(ausg[Dozent].UnterZeiten[u].Kommt, ausg[Dozent].UnterZeiten[u].Geht) + 1;
                    DateTime Anfang = ausg[Dozent].UnterZeiten[u].Kommt;
                    
                    for (int t = 0; t < Tage; t++)
                    {
                        UnterichtsZeiten[Dozent].Add(ausg[Dozent].UnterZeiten[u].Kommt.AddDays(t));
                    }
                    
                }

                this.UnterichtsZeiten[Dozent].Sort();

            }

            DateTime tag = HoleZeiten.HoleErstenTagDesMonats(DateTime.Now);
            DateTime ErsterWochentag = HoleZeiten.ErsterTagDerWoche(tag);
            DateTime LetzterMonatstag = HoleZeiten.HoleLetztenTagDesMonats(tag);
            int AnzahlTageWoche = 7;
            string Monat = HoleZeiten.MonatsName(tag.Month);


            // Erstellen der Table...
            Table table1 = new Table();
            // ...und dem Dokument hinzufügen.
            DozTabelle.Blocks.Add(table1);


            // Globale Formatiereung der Tabelle.
            table1.CellSpacing = 2;
            table1.Background = Brushes.White;
            table1.BorderBrush = Brushes.Black;
            table1.BorderThickness = new Thickness(1);


            // Spalten Hintergrundfarbe festlegen
            for (int Spalte = 0; Spalte <= AnzahlTageWoche; Spalte++)
            {
                table1.Columns.Add(new TableColumn());

                // Jede 2. Spalte andere Farbe
                if (Spalte % 2 == 0)
                    table1.Columns[Spalte].Background = Brushes.Beige;
                else
                    table1.Columns[Spalte].Background = Brushes.LightSteelBlue;
            }

            // Erstellen einer Gruppe die die Zeilen beinhaltet
            table1.RowGroups.Add(new TableRowGroup());

            // Hinzufügen erste Zeile für den Titel
            table1.RowGroups[0].Rows.Add(new TableRow());

            // Zeiger auf die erste Zeile
            TableRow currentRow = table1.RowGroups[0].Rows[0];

            // Formatierung der Zeile
            currentRow.Background = Brushes.LightYellow;
            currentRow.FontSize = 11;
            currentRow.FontWeight = FontWeights.Bold;
            currentRow.FontFamily = new FontFamily("Calibri");

            // Header hinzufügen 
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Dozentenzeiten im " + Monat))));
            // und Spalten verbinden
            currentRow.Cells[0].ColumnSpan = AnzahlTageWoche + 1;

            //Die 2. Zeile hinzufügen.
            table1.RowGroups[0].Rows.Add(new TableRow());
            currentRow = table1.RowGroups[0].Rows[1];

            // und Formatieren
            currentRow.FontSize = 9;
            currentRow.FontWeight = FontWeights.Light;
            currentRow.FontFamily = new FontFamily("Calibri");

            // Jetzt die Spalten
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Raum"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Montag"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Dienstag"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Mittwoch"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Donnerstag"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Freitag"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Samstag"))));
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("Sonntag"))));


            // Jetzt die Tage im Monat zufügen
            int MTage = 0;
            for (int Woche = 1; Woche < 6; Woche++)
            {
                table1.RowGroups.Add(new TableRowGroup());
                table1.RowGroups[Woche].Rows.Add(new TableRow());
                currentRow = table1.RowGroups[Woche].Rows[0];

                // und Formatieren
                currentRow.FontSize = 9;
                currentRow.FontWeight = FontWeights.Light;
                currentRow.FontFamily = new FontFamily("Calibri");

                // Jetzt die Spalten
                currentRow.Cells.Add(new TableCell(new Paragraph(new Run(""))));
                for (int WTage = 0; WTage < AnzahlTageWoche; WTage++)
                {
                    currentRow.Cells.Add(new TableCell(new Paragraph(new Run(ErsterWochentag.AddDays(MTage).ToShortDateString()))));

                    // Wochenende andere Farbe
                    if (ErsterWochentag.AddDays(WTage).IstWochenende())
                    {
                        currentRow.Cells[WTage + 1].Foreground = Brushes.Red;
                    }

                    // Nicht zum Monat passende Tage andersfarbig
                    if(ErsterWochentag.AddDays(MTage) < tag || ErsterWochentag.AddDays(MTage) > LetzterMonatstag)
                    {
                        currentRow.Cells[WTage + 1].Foreground = Brushes.LightGray;
                    }


                    // Jetzt die Einträge der Dozenten in einer neue Zeile
                    for (int Dozenten = 0; Dozenten < ausg.Count; Dozenten++)
                    {
                        for (int UZeile = 0; UZeile < UnterichtsZeiten[Dozenten].Count; UZeile++)
                        {
                            if (ErsterWochentag.AddDays(MTage) == UnterichtsZeiten[Dozenten][UZeile])
                            {
                                currentRow.Cells[WTage + 1].Background = Brushes.Red;
                                // Wie kann ich jetzt den Zelleninhalt ändern ? Finde da nix
                            }
                        }
                    }

                    MTage++;
                }
            }
        }
    }
}


Ihr seht meinem Kommentar? "Wie kann ich jetzt den Zelleninhalt ändern ? Finde da nix"
Da würde ich jetzt gerne den Zellinhalt ändern!!! Aber wie??

Und Nein ... möchte kein Gridview oder Databindings oder ähnliches!!!
Einfach nur Zelleninhalt ändern 🙂

Lieben Gruß
TigerCrow

1.040 Beiträge seit 2007
vor 5 Jahren

Wahrscheinlich in den Blocks.

Du nutzt zum Anlegen ja diesen Konstruktor und übergibst einen Block - in deinem Fall einen Paragraph.

5.658 Beiträge seit 2006
vor 5 Jahren

Hi TigerCrow,

"Wie kann ich jetzt den Zelleninhalt ändern ? Finde da nix"
Da würde ich jetzt gerne den Zellinhalt ändern!!! Aber wie??

Dafür verwendet man MVVM. Man fügt keine UI-Elemente ein, oder ändert diese, sondern man ändert einfach seine Daten und die UI paßt sich automatisch an. So wie du arbeitest, wird das nur Spaghetti-Code, der weder lesbar noch testbar ist.

Weeks of programming can save you hours of planning

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 5 Jahren

Dafür verwendet man MVVM. Man fügt keine UI-Elemente ein, oder ändert diese, sondern man ändert einfach seine Daten und die UI paßt sich automatisch an. So wie du arbeitest, wird das nur Spaghetti-Code, der weder lesbar noch testbar ist.

Tolle Info, was mich aber genau null weiterbringt!

L
136 Beiträge seit 2015
vor 5 Jahren

Hallo TigerCrow,

Und Nein ... möchte kein Gridview oder Databindings oder ähnliches!!!
Einfach nur Zelleninhalt ändern

Was spricht dagegen?
Du erleichterst Dir damit einfach alles....

Musste anfangs auch stolpern, glaub es einfach 😁

Gruss Lhyn

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

falls dir DataBinding nicht gefällt - würde ich dir ehrlich gesagt WindowsForms an's Herz legen - das ist bei der (direkten) Manipulation von Steuerelementen deutlich intuitiver, da WPF-Anwendungen in den meisten Fällen mit Hilfe von MVVM aufgebaut werden.

Dass du hier keine wirklichen Tipps erhälst - sollte dich somit nicht länger wundern. Das liegt zum einen sicher daran, dass keiner Lust hat sich solchen Spaghetticode anzuschauen (was bei WPF selbst wenn man's ordentlich in der gezeigten Variante machen würde so ist) - zum anderen allerdings auch sicher daran, dass es hier noch keiner gemacht und entsprechend nicht weiß.

LG

5.658 Beiträge seit 2006
vor 5 Jahren

Tolle Info, was mich aber genau null weiterbringt!

Das ist alles, was man zu diesem Code sagen kann. Daß es dich nicht weiterbringt, liegt allerdings an dir.

Niemand kann deinen Code lesen, du kannst ihn nicht testen, und funktionieren tut er ja offensichtlich auch nicht. Wenn dir jetzt jemand mit einigen Jahren Erfahrung einen Tip gibt, und du antwortest so, was erwartest du dann eigentlich?

Weeks of programming can save you hours of planning

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 5 Jahren

Danke erstmal für alles 🙂

Habe es jetzt so gemacht das ich noch eine Zeile einfüge 😉

Trotz Nudelcode tut es jetzt 🙂

Übrigens das Grundgerüst der Tabelle ist von MS selbst

Lieben Gruß
TigerCrow

1.040 Beiträge seit 2007
vor 5 Jahren

Man kommt an den Text ran, siehe erste Antwort.

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 5 Jahren

Ja Danke p!lle 🙂

Hat geklappt .. SUPER COOL .... Danke Dir

Muste die Tabelle nur etwas anders erstellen und schon klappt alles .. Riesen Dank

Gruß
TigerCrow