Laden...

ListBox Mehrfachauswahl in PDF Schreiben

Erstellt von Sascha87 vor 3 Jahren Letzter Beitrag vor 2 Jahren 685 Views
S
Sascha87 Themenstarter:in
48 Beiträge seit 2021
vor 3 Jahren
ListBox Mehrfachauswahl in PDF Schreiben

Hallo und einen schönen Sonntag zusammen,
ich bin neu hier im Forum sowie ein recht blutiger Anfänger was C# angeht.
Ich sitze gerade vor einem Problem.
Ich möchten Daten aus einer ListBox in eine PDF schreiben.
Die ListBoxen werden von mir mit Daten aus einer Datenbank befüllt:


listKompetenz.DisplayMemberPath = "kompetenz";
listKompetenz.SelectedValuePath = "id";
listKompetenz.ItemsSource = kompetenzTable.DefaultView;

Jetzt möchte ich, wenn eins der Elemente ausgewählt wurde, das Element in eine PDF (mit PDFSharp) schreiben.
Statt den ausgewählten Text wurde:

Fehlermeldung:
System.Data.DataRowView

ausgegeben.

Also habe ich folgendes gemacht:


var FachItem = (listFach.SelectedItem as DataRowView)["fach"].ToString();

Jetzt wird mir der richtige Text ausgegeben.
Leider habe ich eine Liste, bei der eine Mehrfachauswahl gemacht werden kann. Dort funktioniert es leider nicht.
Wenn ich mit Arrays oder Listen arbeite, meldet er, dass DataRowView nicht als String konvertiert werden kann.
Hat jemand ein Tipp für mich?
Vielen Dank im voraus!
Grüße
Sascha

T
2.224 Beiträge seit 2008
vor 3 Jahren

Wie sieht den der Code genau aus?
Aktuell richt das etwas nach falschem oder gar keinen DataBinding.

Nachtrag:
Wenn du mit Array/Listen arbeitest, solltest du auch kein DataTable oder DataView verwenden sondern die Daten aus der Datenbank auf eigene Klassen mappen.
Dadurch sparst du auch bei großen Listen sehr viel Speicher.
Ebenfalls solltest du für eine Listen Auswahl bzw. dann vermutlich DropDown eine einfache DataSource mit fixen Werten binden.
Leider bin ich nicht wirklich in WPF unterwegs um dir genaue Tipps zu geben, hier solltest du die Doku mal genauer lesen.
Dort ist eigentlich WPF und DataBinding gut dokumentiert.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
Sascha87 Themenstarter:in
48 Beiträge seit 2021
vor 3 Jahren

Ich versuche mal die entsprechenden Code Teile zu kopieren.
Das hier ist die Funktion, die die Werte an die ListBox sendet:


public void ShowKompetenzen()
        {
            try
            {

                //Daten aus der Tabelle lesen
                string query = "select * from kompetenzen a inner join uvKomp uvk on a.id = uvk.kompID where uvk.jahrgangID = @jahrID AND uvk.uvorhabenID = @uvorhabenID order by kompetenz asc";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    cmd.Parameters.AddWithValue("@uvorhabenID", listUvorhaben.SelectedValue);
                    cmd.Parameters.AddWithValue("@jahrID", listJahrgang.SelectedValue);

                    DataTable kompetenzTable = new DataTable();
                    mysqlDataAdapter.Fill(kompetenzTable);

                    listKompetenz.SelectionMode = SelectionMode.Multiple;
                    listKompetenz.DisplayMemberPath = "kompetenz";
                    listKompetenz.SelectedValuePath = "id";
                    listKompetenz.ItemsSource = kompetenzTable.DefaultView;


                }
            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

Das hier ist die entsprechende ListBox in XAML


<ListBox Name ="listKompetenz" HorizontalAlignment="Left" Height="200" Margin="27,549,0,0" VerticalAlignment="Top" Width="441" SelectionChanged="listKompetenz_SelectionChanged_1"/>

Ich habe einen Button eingefügt. Wenn er betätigt wird, wird die PDF (mit PDFSharp) erstellt.

Das ist ein Teilauszug aus dem Bereich:


var kompItems = (listKompetenz.SelectedItem as DataRowView)["kompetenz"].ToString();

gfx.DrawString(kompItems, font, XBrushes.Black, new XRect(40, 320, page.Width, page.Height), XStringFormats.TopLeft);

Das Thema DataBinding schaue ich mir mal an. Ist nur recht schwierig, als Anfänger, die richtigen Seiten zu finden.

Vielen Dank für den Tipp!
Grüße
Sascha

16.842 Beiträge seit 2008
vor 3 Jahren

Ein Grundproblem (unabhängig von Deiner Frage) ist, dass Du leider so programmierst, wie man es bei WPF nicht tun soll. WPF ist so gebaut, dass der MVVM Pattern angewendet wird, der leider eine kleine Lernhürde hat.
[Artikel] MVVM und DataBinding sowie [Artikel] Drei-Schichten-Architektur.
Man kann zwar ohne diesen Pattern durchaus auch gewisse Dinge umsetzen, wie Du es schon getan hast; das Doofe an der Sache ist: verwendest Du WPF ohne MVVM, dann wirst Du von Workaround zu Workaround stolpern, wie es auch hier der Fall wäre.

WPF ist da einfach (genauso wie Angular) durch MVVM nich so super einsteigerfreundlich.
Da musst wirklich nen bisschen Lektüre in die Hand nehmen und Dich einlesen; mit Try and Error versteht man Pattern i.d.R. nicht.

Leider habe ich eine Liste, bei der eine Mehrfachauswahl gemacht werden kann.

Dann musst Du mit SelectedItems (also Plural, nicht das Single-Item) arbeiten.

Ist nur recht schwierig, als Anfänger, die richtigen Seiten zu finden.

Dafür gibts ja die FAQ (siehe Link [Artikel] MVVM und DataBinding).
Es ist aber tatsächlich so, dass die Microsoft Docs den MVVM Teil bei WPF nicht genauer erklären, weil er einfach als Vorraussetzung beim Umgang mit WPF angesehen wird.
Im Bereich von UWP/Xamarin, wo MVVM ebenfalls anwendung findet, gibt es jedoch eine Kurzübersicht Model-View-ViewModel-Muster - Xamarin

T
2.224 Beiträge seit 2008
vor 3 Jahren

Zusätzlich zu dem was Abt schreibt, gefällt mir dein Connection Handling nicht.
In deiner Methode hast du sqlConnection, was du im finally schließt oder innerhalb der Methode nicht öffnest.
Entsprechen hast du irgendwo anders die Verbindung geöffnet und scheinst diese dann geöffnet zu haten.
So programmiert man nicht gegen die Datenbank.
Für das bereithalten von DB Verbindungen kümmert sich i.d.R. der DB Treiber selbst, Stichwort "Connection Pooling".
Die Verbindung selbst soll man nur dort öffnen und direkt schließen, wo diese im Code benötigt werden.
Diese sollen so kurz wie möglich offen bleiben.
Im schlimmsten Fall kann man durch falsches Handling der Verbindungen somit immer mehr Verbindungen öffnen und falsch schließen.
Schau dir dazu auch das Keyword using mit Dispose in Verbindung an.
Dies setzt den finally Teil dann schon um und schließt im Fehlerfall auch die Verbindung korrekt!

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.842 Beiträge seit 2008
vor 3 Jahren

T-Virus - hast ja recht mit Deinem Zusatz.
Aber bei seinem Wissensstand bringt das nichts - außer Verwirrung.

Davon abgesehen: wenn er allgemein die Software Architektur auf einen modernen Stand bringt, wenn er sich das Wissens erarbeitet hat, dann muss man sich auch nicht um die Verbindungshaltung selbst kümmern.

S
Sascha87 Themenstarter:in
48 Beiträge seit 2021
vor 2 Jahren

In erster Linie vielen vielen Dank, das ihr zwei euch die Zeit nehmt.

Den Hinweis mit der Datenbank nehme ich gerne an. Auch, wenn Abt relativ recht hat, das mein Wissensstand nicht besonders groß ist.
Das Projekt ist zum Lernen da. Daher nehme ich jeden Tipp und Hinweis an.
Der jetzige Wissensstand beruht auf einem Udemy Kurs. Irgendwie muss man ja anfangen 😁

Ich bin jetzt mal so frech und stelle den Code per Pastebin online. An welcher Stelle sollte ich die Datenbank öffnen/schließen?

MainWindow.xaml.cs
Edit von Abt: Link entfernt

MainWindow.xaml
Edit von Abt: Link entfernt
DataBindings werde ich mir anschauen. Hier bin ich, wie gesagt, anhand eines Udemy Kurses heran gegangen. Daher habe ich mich auf den Aufbau ein wenig Verlassen.

Zu meinem Ursprünglichen Problem:

Dann musst Du mit SelectedItems (also Plural, nicht das Single-Item) arbeiten.

Das hatte ich probiert. Allerdings gab es ebenfalls nur den genannten Fehler als Ausgabe.

Jetzt habe ich öfters gelesen, dass ich eventuell eine for-Schleife nutzen soll. Wäre das eine Möglichkeit? (als Übergangslösung)

Vielen lieben Dank nochmals!
Liebe Grüße
Sascha

16.842 Beiträge seit 2008
vor 2 Jahren

Bitte [Hinweis] Wie poste ich richtig? beachten und Code in die Tags packen und nicht auf irgendwelche externen Seiten.
Danke.

S
Sascha87 Themenstarter:in
48 Beiträge seit 2021
vor 2 Jahren

Oh, entschuldige bitte. Ich dachte, so bleibt es übersichtlicher.

Hier der Code der MainWondow.xaml.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using MySql.Data.MySqlClient;
using System.Data.Common;
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.Diagnostics;
using System.IO;
using PdfSharp.Pdf.IO;
using System.Collections.Specialized;

namespace HLSFoerderPlaner
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    /// 
    
   
    public partial class MainWindow : Window
    {
        public MySqlConnection sqlConnection;
        public List list;

        
        public MainWindow()
        {
            InitializeComponent();

            logo.Source = new BitmapImage(new Uri(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images\\logo.png")));
            Uri iconUri = new Uri(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images\\favicon.ico"));
            this.Icon = BitmapFrame.Create(iconUri);

            // Erstellung des ConnectionStrings
            string server = "";
            string database = "";
            string uid = "";
            string password = "";
            string connectionString; 
            connectionString = "SERVER=" + server + ";" + "DATABASE=" +
            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";

            sqlConnection = new MySqlConnection(connectionString);
            
            //Ausgabe der Liste - Fach
            ShowFach();
            
        }

        public void ShowFach()
        {
            try
            {
                //Daten aus der Tabelle lesen
                string query = "select * from faecher order by fach asc";
              
                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    sqlConnection.Open();
                    //Daten in fachtable füllen
                   
                    DataTable fachTable = new DataTable();
                    mysqlDataAdapter.Fill(fachTable);

                    listFach.DisplayMemberPath = "fach";
                    listFach.SelectedValuePath = "id";
                    
                    listFach.ItemsSource = fachTable.DefaultView;

                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

        public void ShowJahrgang()
        {
            try
            {
                
                //Daten aus der Tabelle lesen
                string query = "select * from jahrgang a inner join faecherJahrgang fj on a.id = fj.jahrgangID where fj.faecherID = @fachID";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    cmd.Parameters.AddWithValue("@fachID", listFach.SelectedValue);

                    DataTable jahrgangTable = new DataTable();
                    mysqlDataAdapter.Fill(jahrgangTable);

                    listJahrgang.DisplayMemberPath = "jahrgang";
                    listJahrgang.SelectedValuePath = "id";
                    listJahrgang.ItemsSource = jahrgangTable.DefaultView;


                }
            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

        public void ShowUvorhaben()
        {
            try
            {

                //Daten aus der Tabelle lesen
                string query = "select * from uvorhaben a inner join faecherJahrgangUvorhaben fju on a.id = fju.uvorhabenID where fju.fachID = @fachID AND fju.jahrgangID = @jahrID order by uvorhaben asc";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    cmd.Parameters.AddWithValue("@fachID", listFach.SelectedValue);
                    cmd.Parameters.AddWithValue("@jahrID", listJahrgang.SelectedValue);

                    DataTable uvorhabenTable = new DataTable();
                    mysqlDataAdapter.Fill(uvorhabenTable);

                    listUvorhaben.DisplayMemberPath = "uvorhaben";
                    listUvorhaben.SelectedValuePath = "id";
                    listUvorhaben.ItemsSource = uvorhabenTable.DefaultView;

                }
            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

        public void ShowKompetenzen()
        {
            try
            {

                //Daten aus der Tabelle lesen
                string query = "select * from kompetenzen a inner join uvKomp uvk on a.id = uvk.kompID where uvk.jahrgangID = @jahrID AND uvk.uvorhabenID = @uvorhabenID order by kompetenz asc";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    cmd.Parameters.AddWithValue("@uvorhabenID", listUvorhaben.SelectedValue);
                    cmd.Parameters.AddWithValue("@jahrID", listJahrgang.SelectedValue);

                    DataTable kompetenzTable = new DataTable();
                    mysqlDataAdapter.Fill(kompetenzTable);

                    listKompetenz.SelectionMode = SelectionMode.Multiple;
                    listKompetenz.DisplayMemberPath = "kompetenz";
                    listKompetenz.SelectedValuePath = "id";
                    listKompetenz.ItemsSource = kompetenzTable.DefaultView;


                }
            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

        public void ShowKompetenzErwartungen()
        {
            try
            {

                //Daten aus der Tabelle lesen
                string query = "select * from kompErwartungen a inner join uvJahrErwartungen uje on a.id = uje.kompErwartungenID where uje.jahrgangID = @jahrID AND uje.uvID = @uvID order by kompErwartungen asc";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);

                using (mysqlDataAdapter)
                {
                    cmd.Parameters.AddWithValue("@uvID", listUvorhaben.SelectedValue);
                    cmd.Parameters.AddWithValue("@jahrID", listJahrgang.SelectedValue);

                    DataTable kompErwartungenTable = new DataTable();
                    mysqlDataAdapter.Fill(kompErwartungenTable);

                    listFoerder.SelectionMode = SelectionMode.Multiple;
                    listFoerder.DisplayMemberPath = "kompErwartungen";
                    listFoerder.SelectedValuePath = "id";
                    listFoerder.ItemsSource = kompErwartungenTable.DefaultView;


                }
            }

            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            finally
            {
                sqlConnection.Close();
            }
        }

        private void ListFach_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ShowJahrgang();
        }

        private void ListJahrgang_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ShowUvorhaben();
        }

        private void ListKompetenz_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ShowKompetenzen();
            ShowKompetenzErwartungen();
        }

        private void PdfErstellen_Click(object sender, RoutedEventArgs e)
        {
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            PdfDocument document = new PdfDocument();
            PdfPage page = document.AddPage();
            page.Size = PdfSharp.PageSize.A4;
            XGraphics gfx = XGraphics.FromPdfPage(page);


            XFont font = new XFont("Bell MT", 12);
            XFont fontfett = new XFont("Bell MT", 12, XFontStyle.Bold);
            XFont uschrift = new XFont("Bell MT", 18, XFontStyle.Bold);
            

            //Hintergrund- Overlay
            gfx.DrawImage(XImage.FromFile(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "images\\overlay.png")), 0, 0);

            //Überschrift
            gfx.DrawString("Individueller Förderplan von " + name.Text, uschrift, XBrushes.Black, new XRect(40, 150, page.Width, page.Height), XStringFormats.TopLeft);


            var FachItem = (listFach.SelectedItem as DataRowView)["fach"].ToString();
            var UvItem = (listUvorhaben.SelectedItem as DataRowView)["uvorhaben"].ToString();

            
            var kompItems = (listKompetenz.SelectedItem as DataRowView)["kompetenz"].ToString();
            var FoerderItem = (listFoerder.SelectedItem as DataRowView)["kompErwartungen"].ToString();

            gfx.DrawString("Fach: ", fontfett, XBrushes.Black, new XRect(40, 200, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(FachItem, font, XBrushes.Black, new XRect(75, 200, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString("Unterrichtsvorhaben: ", fontfett, XBrushes.Black, new XRect(40, 215, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(UvItem, font, XBrushes.Black, new XRect(155, 215, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString("Lernziel:", fontfett, XBrushes.Black, new XRect(40, 230, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(name.Text + " wird in dieser Unterrichtseinheit ", font, XBrushes.Black, new XRect(40, 245, page.Width, page.Height), XStringFormats.TopLeft);
            
            if (zielgleich.IsChecked == true)
            {
                gfx.DrawString("zielgleich unterrichtet und dabei die nachfolgend aufgeführten Kompetenzen erwerben.", font, XBrushes.Black, new XRect(40, 260, page.Width, page.Height), XStringFormats.TopLeft);
            }
            if (zieldifferent.IsChecked == true)
            {
                gfx.DrawString("zieldifferent unterrichtet und dabei die nachfolgend aufgeführten Kompetenzen erwerben.", font, XBrushes.Black, new XRect(40, 260, page.Width, page.Height), XStringFormats.TopLeft);
            }
            if (alternativLZ.IsChecked == true)
            {
                gfx.DrawString("ein alternatives Lernziel verfolgen und damit die nachfolgend aufgeführten Kompetenzen erwerben.", font, XBrushes.Black, new XRect(40, 260, page.Width, page.Height), XStringFormats.TopLeft);
            }

            gfx.DrawString("Kompetenzerwartungen", fontfett, XBrushes.Black, new XRect(40, 290, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(name.Text + " kennt/kann ... ", font, XBrushes.Black, new XRect(40, 305, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(kompItems, font, XBrushes.Black, new XRect(40, 320, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString("Fördermaßnahmen", fontfett, XBrushes.Black, new XRect(40, 335, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(name.Text + " ... ", font, XBrushes.Black, new XRect(40, 350, page.Width, page.Height), XStringFormats.TopLeft);
            gfx.DrawString(FoerderItem, font, XBrushes.Black, new XRect(40, 365, page.Width, page.Height), XStringFormats.TopLeft);

            string filename = System.IO.Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop), this.name.Text + "-Förderplan.pdf");
            document.Save(filename);
            MessageBox.Show("Die PDF wurde auf dem Desktop gespeichert.");
        }     
}
}


Und hier die entsprechende XAML


<Window x:Class="HLSFoerderPlaner.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HLSFoerderPlaner"
        mc:Ignorable="d"
        Title="Förderplaner" 
        Height="863" 
        Width="1000"
       >
    <Window.Effect>
        <DropShadowEffect/>
    </Window.Effect>
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,10,2,-12" Width="980" Height="834">
        <Label Content="Förderplaner" Margin="333,10,330,748" FontSize="48" FontWeight="Bold" FontStyle="Italic" HorizontalAlignment="Center" Width="317"/>

        <TextBox Name ="name" HorizontalAlignment="Left" Height="23" Margin="288,119,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" RenderTransformOrigin="-0.003,0.669"/>
        <Label Content="Name:" HorizontalAlignment="Left" Margin="222,116,0,0" VerticalAlignment="Top"/>

        <Label Content="Zielkontrolle:" HorizontalAlignment="Left" Margin="426,100,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="lzk" Content="LZK" HorizontalAlignment="Left" Margin="508,107,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="koratest" Content="Kompetenzrastertest(s)" HorizontalAlignment="Left" Margin="508,127,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="klabasis" Content="Klassenarbeit (Basis und Einstieg)" HorizontalAlignment="Left" Margin="508,147,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="klaaufstieg" Content="Klassenarbeit (Einstieg und Aufstieg)" HorizontalAlignment="Left" Margin="508,167,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="alternachweis" Content="Alternativer Leistungsnachweis" HorizontalAlignment="Left" Margin="508,187,0,0" VerticalAlignment="Top"/>

        <Label Content="Zeitraum: " HorizontalAlignment="Left" Margin="690,105,0,0" VerticalAlignment="Top"/>
        <Label Content="Von: " HorizontalAlignment="Left" Margin="758,105,0,0" VerticalAlignment="Top"/>
        <Label Content="Bis: " HorizontalAlignment="Left" Margin="764,141,0,0" VerticalAlignment="Top"/>
        <DatePicker x:Name="Von" HorizontalAlignment="Left" Margin="796,107,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.14,0.656" />
        <DatePicker x:Name="Bis" HorizontalAlignment="Left" Margin="796,142,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.69,1.167"/>

        <CheckBox x:Name="zielgleich" Content="SuS wird zielgleich unterrichtet und dabei die nachfolgend aufgeführten Kompetenzen erwerben." HorizontalAlignment="Left" Margin="31,238,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="zieldifferent" Content="SuS wird zieldifferent unterrichtet und dabei die nachfolgend aufgeführten Kompetenzen erwerben." HorizontalAlignment="Left" Margin="31,258,0,0" VerticalAlignment="Top"/>
        <CheckBox x:Name="alternativLZ" Content="SuS wird ein alternatives Lernziel verfolgen und damit die nachfolgend aufgeführten Kompetenzen erwerben." HorizontalAlignment="Left" Margin="31,278,0,0" VerticalAlignment="Top"/>

        <TextBox Name ="schuljahr" HorizontalAlignment="Left" Height="23" Margin="288,156,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" RenderTransformOrigin="-0.003,0.669"/>
        <Label Content="Schuljahr:" HorizontalAlignment="Left" Margin="222,156,0,0" VerticalAlignment="Top"/>

        <Label Content="Fach:" HorizontalAlignment="Left" Margin="31,310,0,0" VerticalAlignment="Top"/>
        <Label Content="Jahrgang" HorizontalAlignment="Left" Margin="197,310,0,0" VerticalAlignment="Top"/>
        <Label Content="Unterrichtsvorhaben" HorizontalAlignment="Left" Margin="274,310,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.517,-0.346"/>

        <ListBox Name ="listFach" HorizontalAlignment="Left" SelectionChanged="ListFach_SelectionChanged" Height="175" Margin="31,336,0,0" VerticalAlignment="Top" Width="150"/>
        <ListBox Name ="listJahrgang" HorizontalAlignment="Left" SelectionChanged="ListJahrgang_SelectionChanged" Height="175" Margin="202,336,0,0" VerticalAlignment="Top" Width="50"/>
        <ListBox Name ="listUvorhaben" HorizontalAlignment="Left" SelectionChanged="ListKompetenz_SelectionChanged" Height="175" Margin="274,336,0,0" VerticalAlignment="Top" Width="200"/>

        <Label Content="Kompetenzerwartungen:" HorizontalAlignment="Left" Margin="27,523,0,0" VerticalAlignment="Top"/>
        <ListBox Name ="listKompetenz" HorizontalAlignment="Left" Height="200" Margin="27,549,0,0" VerticalAlignment="Top" Width="441"/>
        <Image Name="logo" HorizontalAlignment="Left" Height="213" Margin="28,6,0,0" VerticalAlignment="Top" Width="178" />


        <Label Content="Fördermaßnahmen:" HorizontalAlignment="Left" Margin="496,523,0,0" VerticalAlignment="Top"/>
        <ListBox x:Name ="listFoerder" HorizontalAlignment="Left" Height="200" Margin="496,549,0,0" VerticalAlignment="Top" Width="441"/>
        <Button Name="pdfErstellen" Content="PDF erstellen" HorizontalAlignment="Left" Margin="803,763,0,0" VerticalAlignment="Top" Width="135" Height="35" Click="PdfErstellen_Click"/>



    </Grid>
</Window>


16.842 Beiträge seit 2008
vor 2 Jahren

Also man kann schon erkennen, dass Du wahrscheinlich nich wirklich nen Tutorial von WPF gemacht hast 😉
Da ist schon relativ viel im Argen, wenn man es konzeptionell betrachtet (also gerade doppelter Code, die Trennung von Logik-Code und UI, und dass alles zu MVVM fehlt).
In einer üblichen WPF Umsetzung wird man vermutlich nur die Hälfte an Code brauchen, wie Du es jetzt hast, weil einem hier viel durch Automatismus abgenommen wird.

Da Du lernen willst:

  • Schau Dir wirklich MVVM an; läuft im Ende aber darauf hinaus, dass Du alles neu machen musst ( [Artikel] MVVM und DataBinding)
  • Datenbank-Code hat in der UI nichts zu suchen ( [Artikel] Drei-Schichten-Architektur)
  • Bau Dir eine eigene Klasse für das Erzeugen der PDF. Die PDF ist hier nichts anderes als die Repräsentierung von Inhalten; sollte also keinerkei Code aus der Datenbank kennen. Alle Informationen, die die PDF beinhalten soll, hälst Du in dieser einen PDF Repräsentierungsklasse.
  • Für Datenbank-Operationen setzt man meist den Repository Pattern um; hat oft noch eine Service-Klasse drüber (Logik).
  • DataTables nutzt man eigentlich nicht mehr, weil die völlig veraltet sind und sehr viel speicher fressen. Auch hier verwendet man entsprechend MVVM mit eigenen Modellen pro UI.
  • Abhängigkeiten löst man mit Dependency Injection um, die dann auch automatisch das Connection Handling übernehmen

An welcher Stelle sollte ich die Datenbank öffnen/schließen?

Die Empfehlung ist: Datenbank-Verbindungen sollten immer so kurz wie möglich bestehen.
Ob das nun heisst "pro Fenster eine Verbindung" oder "pro Button-Drücken eine Verbindung" oder...; da gibts keine pauschale Aussage.
Ich sehe jetzt aber keine grundlegende risikoreiche Umsetzung bei Dir, die ein offenes Datenbank-Handle erzeugen würde; der Fehler ist eher, dass Du Verbindungen in den Methoden schließt und dann nicht mehr bei einem erneuten Aufruf öffnest. Dadurch greifst Du auf geschlossene Verbindungen zu, was knallen wird. Aber das Problem hat man gar nicht, wenn man die entsprechend etablierten Pattern verwendet.
Daher sag ich eher: lern und wende lieber die Pattern an, als hier Invest in den Code zu betreiben, das Connection Handling selbst zu übernehmen.

Im Endeffekt kannst Du Dir einfach mal Windows Presentation Foundation - WPF .NET Framework durchlesen.
Das ist viel und wirst Du nicht sofort alles anwenden können; aber die Idee von den Docs ist auch, dass Du es mal gelesen hast und dann weißt, wo Du suchen musst, wenn Du einen Anwendungsfall hast alá "ah, da hab ich mal was gesehen".

Jetzt habe ich öfters gelesen, dass ich eventuell eine for-Schleife nutzen soll. Wäre das eine Möglichkeit? (als Übergangslösung)

Wenn Du auf eine Liste von Elementen zugreifen willst, um diese einzeln zu verarbeiten, dann brauchst Du eine Schleifen-Operation; richtig.