Laden...

Wie kann ich auf selektierte und gefilterte Items mit Abhängigkeit in einem DataSet zugreifen?

Erstellt von Nordlicht777 vor 3 Jahren Letzter Beitrag vor 3 Jahren 463 Views
N
Nordlicht777 Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren
Wie kann ich auf selektierte und gefilterte Items mit Abhängigkeit in einem DataSet zugreifen?

Hallo,

ich habe viele Daten, die in gewisser Beziehung zueinander stehen.
Die Daten sind in drei DataTable's (TradingSystem, Position, Order) abgelegt und stehen in Beziehung über zwei BindingSource's (OrderPosition, Order). Im Anhang habe ich ein Bild abgelegt, welches den Aufbau beschreibt. Das ganze funktioniert Perfekt, genauso wie ich es benötige.

Angelegt habe ich das ganze mit dem Dataset-Designer nach dem Beispiel in folgendem Artikel, dort lässt sich auch das C# herunterladen, nach dem ich exakt vorgegangen bin:

Databinding for Beginners

Für meine Anwendung habe ich die DataTables wie folgt umbenannt:
Category -> TradingSystem
Article -> Position
OrderEntry -> Order

Zur Funktion:
Es gibt verschiedene Tradingsysteme. Zu jedem Tradingsysteme gibt es 0..n Positionen. Zu jeder einzelnen Position gibt es 1..2 Ordern. Man wählt ein Tradingsystem aus und dann werden alle zugehörigen Positionen angezeigt, zu jeder selektierten Position existieren immer zwei Ordern, die dann angezeigt werden. Die Daten werden in drei DataGridView's angezeigt.

Mein Lösungsansatz:

BindingSource bsTradingSystem = new BindingSource();
BindingSource bsPosition = new BindingSource();
BindingSource bsOrder = new BindingSource();

bsTradingSystem.DataSource = tradingSystemBindingSource.DataSource;
bsTradingSystem.DataMember = tradingSystemBindingSource.DataMember;
bsTradingSystem.Position = tradingSystemBindingSource.Position;

bsPosition.DataSource = bsTradingSystem;
bsPosition.DataMember = "OrderPosition";

foreach (var position in bsPosition)
{
     // In "position.Row" kann ich nun alle Positionen zu dem ausgewählten Tradingsystem korrekt sehen.

     // Welcher Code muss jetzt hier eingefügt werden, um auf die zur Position zugehörigen Ordern zuzugreifen ?
}

Jetzt habe ich folgende Lösungsansatz gefunden, um an die entsprechenden Ordern zu kommen:

private void GetChildRowsFromDataRelation(DataTable table)
{
	DataRow[] arrRows;
	foreach (DataRelation relation in table.ChildRelations)
	{
		foreach (DataRow row in table.Rows)
		{
			arrRows = row.GetChildRows(relation);
		}
	}
}

Ich habe nur keine Idee, wie ich das in die obige Foreach Schleife einbauen kann.

Ich versuche schon seit einigen Tagen für dieses Problem eine Lösung zu finden. Ich würde mich deshalb sehr freuen, wenn mir jemand helfen würde.

Gruß
Stefan

5.658 Beiträge seit 2006
vor 3 Jahren

Kannst du dein Problem mal genauer beschreiben und eine konkrete Frage dazu stellen?

Für mich ergibt deine Beschreibung und der von dir gepostete Code keinen Sinn, und ich kann auch nicht erkennen, wo genau du ein Verständnisproblem hast. Da bisher noch keine Antworten gekommen sind, kannst du davon ausgehen, daß es anderen Helfern genauso geht.

Siehe dazu auch [Hinweis] Wie poste ich richtig?

Weeks of programming can save you hours of planning

N
Nordlicht777 Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Ich verstehe das Problem, welches bei meiner Fragestellung entstehen muss. Das Beispielprogramm von meinem Link sieht ziemlich erstaunlich aus. Die Hauptform enthält nur wenige Zeilen Code, um das Dataset zu laden und in die DataTables zu übertragen. Die Verbindung (BindingSource) zwischen der verschiedenen DataTable's werden automatisch über den Dataset-Designer erzeugt. Das Beispielprogramm liefert leider für mich keinerlei Anhaltspunkte, wie ich die bestehenden automatisiert erzeugten Datenbanken und Verbindungen durch Programmcode richtig zugeordnet auslesen kann. In dem Bild im Anhang sind die drei beteiligten DataTable's (Customer, Order, OrderEntry) zu sehen. Über die BindingSource CustomerOrder (rot) sind die Datatable Customer und Order zugeordnet. Über die BindingSource (grün) OrderOrderEntry sind die Datatable Order und OrderEntry zugeordnet.

Ich möchte jetzt zu einem ausgewählten Customer (blaues Rechteck) alle zugehörigen Order (blauer Pfeil) auslesen und zu jeder Order die zugehörigen OrderEntry's (oranger gebogener Pfeil).

Durch den folgenden Code habe ich zu einem ausgewähltem Customer (blaues Rechteck) alle zugehörigen Order (blauer Pfeil) auslesen können.


BindingSource bsCustOrder = new BindingSource();
BindingSource bsOrder = new BindingSource();
BindingSource bsEntry = new BindingSource();

bsCustOrder.DataSource = CustomOrder.DataSource;
bsCustOrder.DataMember = CustomOrder.DataMember;
bsCustOrder.Position = CustomOrder.Position;

bsOrder.DataSource = bsCustOrder;
bsOrder.DataMember = "CustomOrder";

foreach (var order in bsOrder)
{
     // In "order.Row" kann ich nun alle Ordern zu dem ausgewählten Customer korrekt sehen.

     // Welcher Code muss jetzt hier eingefügt werden, um auf die zu einer Order zugehörigen OrderEntry's zuzugreifen ?
}

Mir gelingt aber nicht, die zu jeder Order zugehörigen OrderEntry's (oranger gebogener Pfeil) auszulesen.

Ich hoffe meine Beschreibung verdeutlicht mein Problem nun besser. Ich habe bisher mit Datasets und Datatable gearbeitet, aber nicht mit BindingSource.

Gruß
Stefan

4.942 Beiträge seit 2008
vor 3 Jahren

Bei der BindingSource hast du ja die zugehörige DataSource gesetzt, d.h. damit kannst du dann die Methode GetChildRowsFromDataRelation aufrufen:


var rows = GetChildRowsFromDataRelation(customerDataTable); // oder wie auch immer die DataTable heißt
// du kannst diese DataTable alternativ auch per Casting wieder aus order.DataSource erhalten

Und diese Methode solltest du so umschreiben, daß sie eine List<DataRow> zurückgibt (also das jeweilige Array arrRows der Liste per AddRange hinzufügt).

N
Nordlicht777 Themenstarter:in
3 Beiträge seit 2020
vor 3 Jahren

Hi Th69,
vielen Dank für die Unterstützung.

Die Funktion GetChildRowsFromDataRelation() um die Rückgabe der eingelesenen Zeilen zu erweitern ist eine leichte Übung.

Aber ich komme nicht mit deinen weiteren Hinweisen zurecht, weil ich kenne mich mit den BindingSource nicht gut aus. Ich versuche mich seit zwei Wochen daran, aber ich bekomme das Problem einfach nicht gelöst.

Im Anhang habe ich das komplette C# Projekt hinzugefügt, welches man auch von dem Link aus dem ersten Posting herunterladen kann. Ein Beispielprogramm hilft bestimmt, mein Problem und die Lösung besser zu verstehen.

Ich habe nun das Projekt um einen Knopf "Button1" erweitert, der die Abfrage der Daten auslöst. Der Knopf befindet sich auf der ersten TabPage "Order" in der Groupbox8 links unten. Ich habe alles hinzugefügt, was soweit funktioniert.

Der Zugriff auf die entsprechende DataTable über das DataSet ist leicht, aber führt leider nicht an das Ziel. Ich lese so leider nicht die Daten aus, die ich haben möchte.

List<DataRow[]> arrRows = GetChildRowsFromDataRelation((DataTable)OrderDts.Tables["Order"]);

Welche Daten möchte ich haben am Beispiel Projekt im Anhang auslesen ?
In der Customers Liste wählt man z.B. "Alfreds Futterkiste" aus. In Orders Liste finden sich nun alle Orders von "Alfreds Futterkiste". In Orders kann man nun die verschiedenen Ordern selektieren und findet in OrderEntrys alle zugehörigen Artikel.

Ich möchte jetzt alle zusammenhängenden Daten auslesen.
Alle Order in dem Orders Liste kann ich problemlos einlesen innerhalb einer foreach Schleife. Der erste Datensatz aus dem Orders Liste von "Alfred's Futterkiste" enthält nun folgende Werte:
ID: 10374 CustomerID: ALFKI OrderDate: 05.01.1995 ...
nun möchte ich zusätzlich zu diesem Eintrag die zugehörigen Artikel aus OrderEntrys auslesen:

OrderID: 10374 ArticleID: 51 Article: Manjimup Dried Apples ...
OrderID: 10374 ArticleID: 62 Article: Tarte aus sucre ...

In Summe möchte ich in der eingelesen Order beide Informationen (Order und zugeordnete OrderEntrys) zusammenführen:

  1. Datensatz:
    ID: 10374 CustomerID: ALFKI OrderDate: 05.01.1995 ...
    OrderID: 10374 ArticleID: 51 Article: Manjimup Dried Apples ...
    OrderID: 10374 ArticleID: 62 Article: Tarte aus sucre ...

  2. Datensatz
    ID: 10643 CustomerID: ALFKI OrderDate: 25.09.1995 ...
    OrderID: 10643 ArticleID: 28 Article: Rössle Sauerkraut ...
    OrderID: 10643 ArticleID: 5 Article:Chef Anton's Gumbo Mix ...
    OrderID: 10643 ArticleID: 29 Article:Thüringer Rostbratwurst ...

...x. Datensatz

Bestimmt ist die Lösung ganz einfach, aber ich komme einfach nicht auf die Lösung. Über jede Unterstützung würde ich mich sehr freuen.
**
Mir hat das Problem keine Ruhe gelassen und bin nun zur Lösung gekommen:**

BindingSource bsCustOrder = new BindingSource();
BindingSource bsOrder = new BindingSource();
BindingSource bsOrderEntry = new BindingSource();

bsCustomer.DataSource = bsCustomer.DataSource;
bsCustomer.DataMember = bsCustomer.DataMember;
bsCustomer.Position = bsCustomer.Position;

bsOrder.DataSource = bsCustomer;
bsOrder.DataMember = "CustomerOrder";

List<DataRow> rows = new List<DataRow>();

foreach (DataRowView order in bsOrder)
{
	DataRow arrRows1 = order.Row;
	rows.Add(arrRows1);

    // Lösung:
	bsOrderEntry.DataSource = order;
	bsOrderEntry.DataMember = "OrderOrderEntry";

	foreach (DataRowView orderentry in bsOrderEntry)
	{
		DataRow arrRows2 = orderentry.Row;
		rows.Add(arrRows2);
	}
}

Wie oft im Leben, wenn man etwas möglichst genau beschreibt, dann kommt man oft selbst auf die Lösung.

Vielen Dank an alle, die über eine Lösung nachgedacht haben.

Gruß
Stefan