DataSet Relationen

29/06/2010 - 00:01 von Nico Wessels | Report spam
Hallo NG;

ich kàmpfe immer noch enorm mit Relationen zwischen verschiedenen
DataTables.

Erstes Problem: Ich habe DataTables, die nicht unbedingt in einem
DataSet beherbergt sind bzw. in einem anderen DataSet liegen können als
für die Relation benutzt wird.

Versuche ich die Tabellen in einem neuen DataSet zu gruppieren, kann es
sein, dass ich einen Fehler bekomme, dass diese DataTable schon in einem
anderen DataSet liegt und das nicht gemacht werden kann, super!
Wieso geht das denn nicht? Ich dachte, das wàre so problemlos möglich,
einfach DataTables zu verschiedenen DataSets hinzuzufügen.
Offensichtlich nicht.



Zweites Problem: Ich versuche jetzt schon teilweise etwas üblere
Relationen zu realisieren, was natürlich prompt nicht hin haut und mich
mittlerweile fast zur Weißglut bringt.

Ich habe eine DataTable, die an ein DataGridView angebunden ist. In
einer zwiten DataTable möchte ich gruppierte Werte anzeigen (Beispiel
siehe unten). Beim Klick auf einen Eintrag werden über eine dritte Table
wieder Werte/Zeilen aus der ersten Table eingeblendet. Was eingeblendet
werden soll, ist abhàngig davon, ob der entsprechende Wert in einer der
Spalten aus Tabelle 1 vorkommt, oder nicht.


DataGridView2/DataTable

| A | B | C | D |

| | | | |
| | B1 | | |
| | B2 | | |
| | | | |



DataGridView2

| E |

| V1 | <-- User klickt z.B. auf V1 *)
| V2 |



*) Nach Klicken auf einen Eintrag, z.B. V1 werden aus einer anderen
DataTable alle Elemente, die zu V1 gehören gefiltert. Im Beispiel sollen
das mal "B1" und "B2" sein. Aufbau dieser DataTable


| F | G |

| V1 | B1 |
| V1 | B2 |
| .. | .. |
| V3 | B2 |
| V3 | B5 |

Die DataTable wird nirgends angezeigt, sondern dient nur der
Realisierung der Relationen.


Ich möchte irgendwie aus der ersten DataTable alle Elemente Filtern, die
in einer der Spalten B, C oder D einen zu V1 gehörenden Wert "B1" oder
"B2" enthàlt.



Die erste Relation blendet mir also in einer DataTable alle Werte ein,
die zu V1 gehören. Diese werden benutzt, um Zeilen aus DataTable 1 in
einem dritten DataGridView anzuzeigen. Die Ansicht in DataGridView 1
bleibt also wie sie ist.



Zusammenfassung: Was soll also heraus kommen?

User klickt auf V1 und bekommt im dritten DataGridView entsprechende
Zeilen aus dem ersten DataGridView mit Spalten (A, B, C, D) eingeblendet.

Welche Zeilen das sind, wird über die zweite Tabelle bestimmt. Zu V1
gehören also hier die Werte B1 und B2. Kommt B1 oder B2 in einer der
Spalten B, C oder D vor, sollen entsprechende Zeilen eingeblendet werden.



Leider haut das ganze überhaupt nicht hin. Eine Relation zwischen
DataTable 2 und DataTable 1 kann nicht gemacht werden, da die Werte in
DataTable 2 wohl nicht eindeutig sind. Gut, stimmt schon, die sind nur
eindeutig, wenn man die Spalte (F, G) zusammengesetzt betrachtet.
Gefiltert werden soll aber nur auf den entsprechenden Wert aus Spalte G.

Zweite Schwierigkeit, auf die ich noch keine Lösung finden konnte, ist
das Verknüpfen mit irgendeiner Spalte B, C, D. Es sollen alle Zeilen in
DataGridView 3 angezeigt werden, die entweder in Spalte B, C oder D den
Wert enthalten.



Jetzt ist die Frage groß, wie um alles in der Welt sich dieses (für
meine Begriffe) komplexe Relationen-Gebilde realisieren làsst? Jemand
Vorschlàge?
 

Lesen sie die antworten

#1 Peter Fleischer
29/06/2010 - 12:47 | Warnen spam
"Nico Wessels" schrieb im Newsbeitrag
news:
...
Erstes Problem: Ich habe DataTables, die nicht unbedingt in einem DataSet
beherbergt sind bzw. in einem anderen DataSet liegen können als für die
Relation benutzt wird.



Hi Nico,
DataRelation-Objekte kann man nur in einem DataSet zwischen Spalten zweier
in diesem DataSet liegenden Tabellen anlegen.

Versuche ich die Tabellen in einem neuen DataSet zu gruppieren, kann es
sein, dass ich einen Fehler bekomme, dass diese DataTable schon in einem
anderen DataSet liegt und das nicht gemacht werden kann, super!
Wieso geht das denn nicht? Ich dachte, das wàre so problemlos möglich,
einfach DataTables zu verschiedenen DataSets hinzuzufügen. Offensichtlich
nicht.



Eine DataTable kann als Container nur ein DataSet haben. Wenn du damit nicht
leben kannst, dann musst du selbst Code schreiben.

Zweites Problem: Ich versuche jetzt schon teilweise etwas üblere
Relationen zu realisieren, was natürlich prompt nicht hin haut und mich
mittlerweile fast zur Weißglut bringt.



Ich weiß nicht, was bei dir "üblere Relationen sind", aber, ein
DataRelation-Objekt erstellt eine 1:n-Beziehung zwischen zwei DataTables in
einem DataSet. "1" sagt aus, dass es nur einen Master-datensatz geben kann.
"n" sagt aus, dass es eine beliebige Anzahl von Child-Datensàtzen geben
kann.

...
Ich möchte irgendwie aus der ersten DataTable alle Elemente Filtern, die
in einer der Spalten B, C oder D einen zu V1 gehörenden Wert "B1" oder
"B2" enthàlt.



Da du hier eine n:m-Beziehung hast, die mit Zwei Master-Tabellen und einer
gemeinsamen Child-Tabelle aufgebaut ist, kannst du mit DataRelations keine
direkte Beziehung zwischen den beiden Master-Tabellen aufbauen, da
DataRelations nur 1:n-Beziehungen erstellen können.

...
Jetzt ist die Frage groß, wie um alles in der Welt sich dieses (für meine
Begriffe) komplexe Relationen-Gebilde realisieren làsst? Jemand
Vorschlàge?



Es gibt das 2 Wege:

1. Projektion des Inhaltes eine Master-Tabelle auf die Child-Tabelle, um
dann eine Master-Child-Darstellung aufzubauen, wobei die Child-Tabelle
zusàtzlich zu den eigenen Daten auch die aus der anderen Master-Tabelle
projizierten Daten darstellen kann. Zu realisieren ist so etwas über
Expression-Spalten. Gefiltert werden kann dann auch über die
Expression-Spalten.

2. Per Code bei Wechsel des Master-Datensatzes in der Anzeige die restlichen
Daten bereitstellen. Dazu eignet sich ein LinQ mit Join.

Viele Gruesse

Peter

Ähnliche fragen