Laden...

[Erledigt] DataGridView (WPF) mit Klasse zugreifen!

Erstellt von wlfmario vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.371 Views
W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 4 Jahren
[Erledigt] DataGridView (WPF) mit Klasse zugreifen!

Ich hatte die Idee eine Methode in eine Klasse zu schreiben , mit der ich Inhalte in verschiedenen DataGrid laden kann ohne jedesmal das gleiche zu schreiben bei mehreren DataGrid's im Projekt.

Erklärung:
Ich habe xaml Datei Namens Start auf der ich ein DataGrid eingefügt habe.

... 
    Title="Start">

    <Grid>
        <DataGrid x:Name="dataGrid" />
    </Grid>
...

Auf dieses DataGrid und Später auch auf andere möchte ich aus meiner Klasse mit einer Methode zugreifen und dabei das angesprochene DataGrid mit übergeben.

Meine erste Idee sieht wie folgt aus:


 public void UpdateDataGrid(DataGrid DGName, SQLiteConnection con, string sql)
        {
            DataSet MyDataSet = new DataSet();
            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
            dataAdapter.Fill(MyDataSet);
            DGName.ItemsSource = MyDataSet.Tables[0].DefaultView;
        }

Leider funktioniert das nicht so, da ich irgendwie nicht auf das DataGrid zugreifen kann bzw. mit übergeben kann.

Kann mir jemand erklären wie ich diese Methode erstellen muss damit sie Funktioniert besser auf was ich achten muss ?

Danke schon einmal für eure Antworten.

16.834 Beiträge seit 2008
vor 4 Jahren

Die Idee existiert prinzipiell bereits aus der Kombination von MVVM und einer ordentlichen Software Architektur:
[Artikel] MVVM und DataBinding
[Artikel] Drei-Schichten-Architektur

Was Du da aktuell machst ist ein wilder Mix, der viele Abhängigkeiten erzeugt, gegen jegliches Muster verstößt, quasi untestbar ist und die Erweiterbarkeit stark einschränkt.

In Summe: gute Idee - aber machs bitte ordentlich 😃

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 4 Jahren

Danke für den Hinweis, da werde ich mich mal Einarbeiten müssen.
Bei den ersten Gehversuchen, stoße ich noch auf ein kleines Problem bei dem ich keine Antwort finde.

Ich binde eine xaml-Seite über ein Frame in mein Window ein:

 <Frame x:Name="frame" Content="Frame" Width="Auto" Padding="5" Margin="5" Background="AliceBlue" Uid="Frame" Source="Start.xaml"/>

in der Seite (Start.xaml) habe ich ein DataGrid eingefügt:

<Grid>
        <DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="True" Uid="dataGrid"/>
    </Grid>

Wie muss ich jetzt genau verfahren, damit sich das DataGrid mit Daten füllt ?
Wenn ich ein DataGrid direkt auf mein Window packe, funktioniert das mit diesem Code:

DataSet MyDataSet = new DataSet();
            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
            dataAdapter.Fill(MyDataSet);
            this.DataContext = MyDataSet.Tables[0].DefaultView;

Allerdings funktioniert das nicht mit der DataGrid im Frame.
Wie kann man dies Realisieren ?
Besser wie binde ich das DataGrid aus der Start.xaml mit den Daten ?

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 4 Jahren

Ok. ich denke es hat sich Erledigt !
Man muss das wohl auch in der C# Datei der Seite machen und in einer anderen ! 😄

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 4 Jahren
SQLite Connection in WPF auf versch. Seiten benutzen

Ich weiß viele Wege führen nach Rom aber da ich zur Zeit noch in der Lernphase bin, mache ich mir Code Technisch hier und da meine Gedanke um Fehler direkt auszumerzen.

Im meine WPF-Projekt binde ich über Frames verschiedene Seiten ein, auf denen Versch. Tabellen aus einer Datenbank angezeigt werden.

Jetzt könnte ich zwar in jedem C#-Code der Seiten den Code Einfügen:


...
 try
            {
                string sql = "SELECT * FROM TabellenName";
                SQLiteConnection con = new SQLiteConnection("Data Source = MyDatenbank.DB; Version=3;");
                DataSet MyDataSet = new DataSet();
                SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
                dataAdapter.Fill(MyDataSet);
                this.DataContext = MyDataSet.Tables[0].DefaultView;
                con.Close();
            }
            catch
            {
...

aber da habe ich irgendwie das Gefühl das ich X-mal eine Connection öffne und hunderte von Zeilen Code umsonst geschrieben werden.

Die zweite Idee die ich hatte, war die Zeilen in eine Klasse (Methode) auszulagern und in jeder C#-Datei wo es benötigt wird, dort ein Object zu erstellen.
Ok. es werden genau so viele Connection geöffnet und geschlossen aber der Code wird um einiges Weniger und Übersichtlicher.

Meine Frage nun:
Kann ich das mit ruhigen Gewissen so über eine Methode in eine Klasse machen oder gibt es dort Fallstricke die ich beachten muss ?

Gibt es andere Möglichkeiten die ich noch nicht in betracht gezogen habe ?

Danke schon einmal für eure Antworten.

4.939 Beiträge seit 2008
vor 4 Jahren

Hallo,

du solltest möglichst die [Artikel] Drei-Schichten-Architektur einhalten (also nicht direkt im UI-Code auf Datenbanken zugreifen).

Bei ADO.Net Connections ist es richtig so, daß diese immer nur kurzzeitig (wieder) geöffnet werden, durch das Connection-Pooling gibt es dadurch (fast) keine Performance-Probleme damit.

Für die Datenbankanbindung solltest du dich an den Stichworten Repository und Unit of Work orientieren (gibt dazu einige Beiträge hier im Forum, besonders von Abt).

Außerdem könntest du dich auch mal mit ORMs (Object Relational Mapper) beschäftigen, welche code-technisch einiges an Arbeit abnehmen.