myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Wie kann ich eine Datenbank in einem DataGrid anzeigen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich eine Datenbank in einem DataGrid anzeigen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
AceTecNic AceTecNic ist männlich
myCSharp.de-Mitglied

Dabei seit: 23.02.2018
Beiträge: 22
Entwicklungsumgebung: Microsoft Visual Studio 2017
Herkunft: Bayern


AceTecNic ist offline Füge AceTecNic Deiner Kontaktliste hinzu

Wie kann ich eine Datenbank in einem DataGrid anzeigen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: <MariaDB10 [SynologyDS218+]>

Hallo zusammen.

Nachdem ich mein letztes Projekt (halbwegs) abgeschlossen habe, mach ich mich an mein nächstes langsam ran.
Ich möchte (langfristig) ein Zentrales Verwaltungssystem für meinen Betrieb basteln. Dafür habe ich mir auch schon ein vorläufiges Design erstellt. Soviel mal dazu.

Ich habe mir das ganze mal angesehen und ein wenig im Internet geschnuppert, aber eine DB lässt sich nicht vermeiden. Da ich unter anderem die NAS von Synology verwende, habe ich MariaDB hierfür gewählt.

Mein aktuelles Problem besteht beim laden der DB in ein DataGrid. Da meine Anleitung etc. dafür nicht geeignet ist, komme ich auch nach einigen Versuchen nicht weiter...

Laut der Anleitung soll ich im Aktionsfenster (rechtsunten) die Aktion "Shown" benutzen. Den gibt es aber nicht. Daher habe ich eine andere genommen, mit der es aber auch nicht ganz will.

Letztendlich kommt (bevor das 2. Fenster aufgeht) eine Fehlermeldung: Unable to connect to any of the specified MySQL hosts.
Mit einem SQL Tester kann ich aber die Verbindung aufbauen?



Eventuell hat mir ja jemand einen Hinweis woran es liegen könnte.

Vielen Dank für eure Mithilfe!!!!

EDIT: Ich habe die Fehlermeldung mittlerweile wegbekommen. Window_Loaded war das richtige. Allerdings habe ich noch keinen Inhalt aus der DB?

C#-Code:
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.Shapes;
using MySql.Data;
using MySql.Data.MySqlClient;
using MySql.Web;
using System.Data;
using System.Data.Common;

namespace SCM
{



    /// <summary>
    /// Interaktionslogik für Auftragsverwaltung.xaml
    /// </summary>
    public partial class Auftragsverwaltung : Window
    {
            MySqlConnection connection = new MySqlConnection();
            private string db_server = "192.168.0.77";
            private string db_user = "root";
            private string db_password = "PRIVATE";
            private string db_name = "SCMDATA";
            private string db_port = "3307";


        public Auftragsverwaltung()
        {
            InitializeComponent();
            connection.ConnectionString = "Server=" +db_server + "; Database=" +db_name + "; Uid=" +db_user + "; Pwd=" +db_password + "; Port=" +db_port + ";";
        }

        private void ZurückMainWindow(object sender, RoutedEventArgs e)
        {
            MainWindow mainWindow = new MainWindow();
            this.Close();
            mainWindow.Show();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                connection.Open();
            }
            catch (MySqlException exc)
            {
                MessageBox.Show(exc.Message, "Datenbankfehler", MessageBoxButton.OK);
                this.Close();

            }



        }

        public DataTable DatenVonTabelle(string Tabelle, string Filter = "")
        {
            DataTable dt = new DataTable();
            try
            {
                if (connection.State != ConnectionState.Open)
                    connection.Open();
                DGAuftrag.DataContext = DatenVonTabelle("Mitarbeiter");
                String abfrage = "SELECT* FROM " +Tabelle + (Filter == "" ? String.Empty : " WHERE " +Filter);
                MySqlDataAdapter msda = new MySqlDataAdapter(abfrage, connection);
                msda.Fill(dt);
                connection.Close();
            }
            catch (MySqlException e)
            {
                MessageBox.Show(e.Message, "Datenbankfehler", MessageBoxButton.OK);
                if (connection.State == ConnectionState.Open) connection.Close();
            }
            return dt;
        }




    }
}

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von AceTecNic am 22.07.2020 15:58.

Neuer Beitrag 22.07.2020 15:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.775
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da hast du vermutlich einen Logikfehler bzgl. deiner Fenster (Windows) - Kommunikation drin.

Wer ruft denn DatenVonTabelle auf? Und was soll der rekursive Aufruf dadrin

C#-Code:
DGAuftrag.DataContext = DatenVonTabelle("Mitarbeiter");

?

Und deine Methode ZurückMainWindow erzeugt ein neues MainWindow-Objekt (anstatt zum aufrufenden MainWindow-Objekt zurückzukehren)!

Du wirst aber nicht darum herum kommen (bzgl. "Zentrales Verwaltungssystem für meinen Betrieb"), dich mit den wichtigsten Architektur- und Designprinzipien vertraut zu machen:
 [Artikel] Drei-Schichten-Architektur
 [Artikel] MVVM und DataBinding

Und bzgl. Datenbankabfragen auch  [Artikelserie] SQL: Parameter von Befehlen.
Neuer Beitrag 22.07.2020 17:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
AceTecNic AceTecNic ist männlich
myCSharp.de-Mitglied

Dabei seit: 23.02.2018
Beiträge: 22
Entwicklungsumgebung: Microsoft Visual Studio 2017
Herkunft: Bayern

Themenstarter Thema begonnen von AceTecNic

AceTecNic ist offline Füge AceTecNic Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Wer ruft denn DatenVonTabelle auf? Und was soll der rekursive Aufruf dadrin

Das sollte aufgerufen werden, sobald Window_Loaded

C#-Code:
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                connection.Open();
///dgvCocktails.DataSource = DatenVonTabelle(„Cocktails“); !--Aus dem Tutorial
///DGMitarbeiter.DataSource = DatenVonTabelle("Mitarbeiter");   !--DataSource steht nicht zur Auswahl
             }
            catch (MySqlException exc)
            {
                MessageBox.Show(exc.Message, "Datenbankfehler", MessageBoxButton.OK);
                this.Close();

            }
        }

Zitat:
Und deine Methode ZurückMainWindow erzeugt ein neues MainWindow-Objekt (anstatt zum aufrufenden MainWindow-Objekt zurückzukehren)!

Ist das Falsch? Bzw. nicht ganz Richtig? Beim drücken des Auftragsfensters wird das MainWindow geschlossen und das Auftrags (Mitarbeiter) Fenster geöffnet. Zurück das selbe.


Das mit der Dreischichten-Architektur hatte ich mal angeschnitten, denke das kommt noch so nach und nach. verwundert

Danke für deine Nachricht.
Neuer Beitrag 22.07.2020 17:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im Endeffekt ist die Basis falsch, ja.

WPF ist darauf ausgelegt, dass Du mit dem MVVM Pattern arbeitest, was Du leider nicht tust.
Daher stimmt die Grundfunktionalität nicht, wie Du die Sache angehst. Es wird Dir leider nicht helfen, das nach und nach zu machen, weil das der Grundbaustein Deiner Anwendung ist, den Du nicht "einfach mal so" ersetzen wirst.

Du solltest das so machen, wie es in WPF eben vorgesehen ist; sonst wirst Du ständig stolpern und Dir Workaround um Workaround bauen.

Zitat:
Ist das Falsch? Bzw. nicht ganz Richtig?

Normalerweise würde man ein Fenster verstecken und nicht zerstören.
Neuer Beitrag 22.07.2020 17:35 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.775
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

C#-Code:
///dgvCocktails.DataSource = DatenVonTabelle(„Cocktails“); !--Aus dem Tutorial
///DGMitarbeiter.DataSource = DatenVonTabelle("Mitarbeiter");   !--DataSource steht nicht zur Auswahl

Du hast dies aus einem Tutorial für Windows Forms (WinForms). Beim WPF-DataGrid heißt die Eigenschaft ItemsSource, s.a.  DataGrid in WPF sowie  WPF DataGrid Examples.

Zitat von AceTecNic:
Ist das Falsch? Bzw. nicht ganz Richtig? Beim drücken des Auftragsfensters wird das MainWindow geschlossen und das Auftrags (Mitarbeiter) Fenster geöffnet. Zurück das selbe.

Du verlierst aber jegliche Daten beim Schließen des Hauptfensters (außerdem sollte sich dann auch das ganze Programm schließen - oder hast du es nur versteckt?).
Generell sollte aber ein untergeordnetes Fenster niemals Zugriff auf das übergeordnete Fenster haben (Stichwort: Wiederverwend- und Wartbarkeit), s.a.  [FAQ] Kommunikation von 2 Forms bzw. meinen eigenen Artikel dazu  Kommunikation von 2 Forms.

Warum öffnest du das 2. Fenster denn nicht einfach (ersteinmal) modal ( Window.ShowDialog())?

Noch besser wäre es, wenn du einfach nur den Inhalt des Fensters austauschst ("Page Navigation"), s.a.  Wie implementiere ich einen Zurück-Button in einer App-Navigation mit MVVM? und  Wie mit MVVM mehrere Views nach Auswahl im MainWindow anzeigen?.
Neuer Beitrag 22.07.2020 18:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
AceTecNic AceTecNic ist männlich
myCSharp.de-Mitglied

Dabei seit: 23.02.2018
Beiträge: 22
Entwicklungsumgebung: Microsoft Visual Studio 2017
Herkunft: Bayern

Themenstarter Thema begonnen von AceTecNic

AceTecNic ist offline Füge AceTecNic Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für eure Hilfe!

@Abt
Mir war wohl nicht bewusst, dass der Unterschied zwischen WFA und WPF doch so groß ist...

Bevor ich an hier groß weiter "bastel" (mit programmieren hat das nichts zu tun unglücklich ), lese ich mich zuerst einmal in die MVVM Geschichte ein. Anschließend probiere ich mich an einem DataTable und nicht wieder alle auf einmal.

@Th69
Ich hatte es anfangs versteckt mit Window.hidden, allerdings habe ich (fällt mir eben auf) das versteckte Fenster nicht mehr Sichtbar gemacht sondern neu aufgerufen. Dadurch war ein Fenster immer im Hintergrund und noch Aktiv. Deshalb habe ich meine alte Methode angewand...
Danke.


Ich kümmere mich vorerst um ein paar grundliegende Sachen und versuche es nochmal.
Der Beitrag kann fürs erste als Erledigt angesehen werden.

Danke für euren Beistand! smile
Neuer Beitrag 23.07.2020 10:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von AceTecNic:
Mir war wohl nicht bewusst, dass der Unterschied zwischen WFA und WPF doch so groß ist...

Data Binding und Patterns gibt es in Forms genauso; vor allem der  MVP Pattern ist hier weit verbreitet.
Du wirst bei Forms aber nicht wirklich zur Anwendung eines Binding Patterns "gezwungen", obwohl ein solcher Pattern natürlich immer zu empfehlen ist und das Leben eines Forms Entwicklers leichter macht und die Code Qualität erhöht.
Bei WPF rächt sich das hingegen sehr schnell.

MVVM ist mittlerweile der mit Abstand am meisten verbreitete Pattern in der UI Welt (nicht nur im .NET Ökosystem).
Neuer Beitrag 23.07.2020 10:37 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.10.2020 22:36