Laden...

Wie kann ich zwei DataGrids aus einer Datenquellebediene und die Ansicht filtern?

Erstellt von echdeneth vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.126 Views
echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren
Wie kann ich zwei DataGrids aus einer Datenquellebediene und die Ansicht filtern?

Moin, ich verwende wie gesagt MySQL und möchte 2 DataGrids aus der selben Quelle bedienen.

Beide DGs haben eine Checkbox über die die Einträge in die jeweil andere DG verfrachtet werden sollen.
(Das Setzen einer Checkbox endigt wahrscheinlich in einer SQL Anweisung, die diesselbe in der DB abbildet) Grundlage für die DG ist eine (oder 2, oder 3) ObservableCollection.
Und über eine CollectionViewSource wird gefiltert (Suche).

Sollte ich jeweils einen weiteren Filter einbauen (Checkbox Ja/Nein)?
Oder per Lambda Expression trennen? Oder 2 separate SQL Anfragen bei der beide DGs getrennt bedient werden?

Wie würdet Ihr das machen?

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

P
441 Beiträge seit 2014
vor 3 Jahren

Am besten: Gar nicht 😃

Deine Desktop Applikation sollte keinen direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren.

5.657 Beiträge seit 2006
vor 3 Jahren

Wenn es sich um eine lokale Datenbank handelt, benötigt man keinen Webservice. Was man aber braucht, ist eine Trennung in Datenzugriffsschicht (DAL) und Benutzeroberfläche (UI). In der DAL wird die Zuordnung abgefragt und geändert, und in der UI wird diese Zuordnung über ein Command ausgelöst, und das Resultat angezeigt.

Die Fragen nach Filter, Labda-Expressions und SQL-Anweisungen verstehe ich nicht. Wir wissen weder, wie deine Datenbank aufgebaut ist, noch kennen wir deine deine Modelle. Wo genau liegt dein Problem?

Weeks of programming can save you hours of planning

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Sorry, aber ich habe meine Fragestellung offenkundig nicht nur geringfügig verkackt.

... direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren. Da informiere ich mich mal in der Thematik, im aktuellen Projekt wahrscheinlich nicht umsetzbar.

Und bei der Trennung der Schichten brauche ich einfach viel mehr Übung, Praxis und leicht verständliche Beispiele, bin ja nicht nehr der Jüngste...

Die Fragen nach Filter, Labda-Expressions und SQL-Anweisungen verstehe ich nicht. Wir wissen weder, wie deine Datenbank aufgebaut ist, noch kennen wir deine deine Modelle. Wo genau liegt dein Problem? Ich weiss dass ich ein Problem mit Fragestellungen habe 😁

Habe die Lösung (oder ein Teil davon) selbst gefunden


_liste_a = (ObservableCollection<Model>)_list.Where(x => x.CheckBoxChecked == true);
_liste_b = (ObservableCollection<Model>)_list.Where(x => x.CheckBoxChecked == false);

Wenn ihr immer noch nicht wisst worauf ich hinaus wollte, weiss ich auch nicht mehr weiter...
Das ganze wird dann später noch in ein ModelView verpackt

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

309 Beiträge seit 2020
vor 3 Jahren

... direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren.
Da informiere ich mich mal in der Thematik, im aktuellen Projekt wahrscheinlich nicht umsetzbar.

Und bei der Trennung der Schichten brauche ich einfach viel mehr Übung, Praxis und leicht verständliche Beispiele, bin ja nicht nehr der Jüngste...

Nur als ganz einfaches Beispiel wie ich es mache, vielleicht haben andere bessere Ideen:
Ein Interface z.B. IDataService mit Funktionen die die gewünschten Daten als Objekte verarbeiten sollen (GetCustomers(), SetCustomer(), DeleteCustomer(),...), welche du in deinem Projekt dann benutzt.
Davon erstellt du dann eine abgeleitete Klasse und packst deine SQL Abfragen rein.
Damit hast du jederzeit die Möglichkeit einfach eine neue Klasse zu erstellen und das ganze auch über andere Wege (z.B. Webservice) laufen zu lassen.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

... Ein Interface z.B. IDataService ...

Von Interfaces habe ich gehört, aber noch keine praktischen Erfahrungen damit machen können.
Könnte aber genau das sein was ich suche...

bei o.g. C# Code kommt folgendes:> Fehlermeldung:

Fehlermeldung: Das Objekt des Typs "WhereEnumerableIterator1[...Model]&quot; kann nicht in Typ &quot;System.Collections.ObjectModel.ObservableCollection1[...Model]" umgewandelt werden.

🙁

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

P
441 Beiträge seit 2014
vor 3 Jahren

Die Where() Erweiterungsmethode gibt keine Observable Collection wieder, sondern einen Enumerable<T> (im weitesten Sinne).

Wenn du davon eine Kopie(!) als ObservableCollection haben willst, müsstest du den Enumerable an den Konstruktor einer ObservableCollection übergeben: https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1.-ctor?view=netcore-3.1


var collection = new ObservableCollection<Model>(_liste.Where(... bedingung ...));

Das erzeugt wie gesagt eine Kopie der Liste (aber idr. keine Kopie deiner Objekte).

Natürlich stimmt mein Einwand mit "immer eine API nutzen" nicht in allen Fällen - aber ich würde behauptden, dass es in 99,9% sinnvoller ist, eine API und ggf. eine zentralisierte Datenbank als ein lokales(!) DBMS zu nutzen.
Bei lokalen Datenbanken bietet sich meistens an eine einbettbare Datenbank (wie z.B. SQLite) zu nehmen. Das raubt auch dem Rechner keine Ressourcen durch einen dauerhaft laufenden Daemon.

Bezüglich Services, Interfaces usw. kann ich nur Empfehlen, dass du dich mit den Grundlagen auseinanderzusetzen und in dem Zuge kannst du dir gleich das Dependency Injection (z.B. am Beispiel des von MS mit .NET Core mitgelieferten Framework) und das Repository Pattern anschauen.

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Danke, das war hilfreich.

Unsere Datenbank liegt auf einem Server eines WebHosters und an "klassischen" MySQL-Snfragen al la:


using (MySqlConnection connection = new MySqlConnection(ConnString))
                    {
                        string query= "SELECT * FROM BLABLA;";
                        connection.Open();
                        using (MySqlCommand cmd = new MySqlCommand(query, connection))
                        {
                            using (reader = cmd.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    // Zeugs
                                 }
                             }
                         }
                     }

daran geht kaum ein Weg vorbei da mehrere Nutzer und eine DB, ich könnte höchstens die Abfrage optimieren...

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

P
441 Beiträge seit 2014
vor 3 Jahren

Dann sollte definitiv eine HTTP API dazwischen!

Die Datenbank sollte nicht über das Internet erreichbar sein!

echdeneth Themenstarter:in
161 Beiträge seit 2019
vor 3 Jahren

Dann sollte definitiv eine HTTP API dazwischen!

??? - habe ich mich noch nicht mit befasst... 🤔

Die Datenbank sollte nicht über das Internet erreichbar sein!

Muss sie doch wenn mit der App auf verschiedenen Rechnern auf dieselbe DB
zugegriffen werden muss, ich wüsste nicht wie das anders gehen sollte...?!?!? 8o ?(

"Man muß die Dinge so einfach wie möglich machen. Aber nicht einfacher." Albert Einstein

5.657 Beiträge seit 2006
vor 3 Jahren

Such mal nach: Webservice, Web API, REST.

Weeks of programming can save you hours of planning

309 Beiträge seit 2020
vor 3 Jahren

Muss sie doch wenn mit der App auf verschiedenen Rechnern auf dieselbe DB
zugegriffen werden muss, ich wüsste nicht wie das anders gehen sollte...?!?!? 8o ?(

Nur die Host App die die API zur Verfügung stellt greift auf die Datenbank zu. Die beiden liegen z.B. auf dem selben System, so dass die Datenbank gar nicht von außen erreichbar ist. Die Clients greifen auf die API zu, damit bekommt auch jeder nur dass was er kriegen darf.