Filtern von Datenserten mittels Relation-Objekt

15/06/2010 - 19:35 von Nico Wessels | Report spam
Hallo NG;

ich habe in einer Datenbank 3 Tabellen mit etwa folgendem Aufbau:

table1:
| Geraete | Param_1 | Param_2 | ... |
| g1 | p_1 | p_2 | ... |
| g2 | p_1 | p_2 | ... |
| ... | ... | ... | ... |


table2
| Konfiguration | Name | Erstelldatum | Ersteller |
| config1 | Name_config1 | 10.06.2010 | ... |
| config2 | Name_config2 | 14.06.2010 | ... |
| ... | ... | ... | ... |


Jeder Konfiguration aus "table2" kann eine Menge von Geràten aus
"table1" zugeordnet werden:

config1 - g1, g2, g6
config2 - g2, g9, g200, g345
...

Die Verknüpfung zwischen den Tabellen findet über "table3" statt, die
etwa so aussieht:

| id_config1 | id_geraet1 |
| id_config1 | id_geraet2 |
| id_config1 | id_geraet6 |
| id_config2 | id_geraet2 |
| id_config2 | id_geraet9 |
| id_config2 | id_geraet200 |
| id_config2 | id_geraet345 |
| ... | ... |


In der Oberflàche sieht es so aus, dass innerhalb eines TabControl-Tab
in einem DataGridView (dataGrid1) die gesamte "table1" angezeigt wird.

In einem zweiten Tab werden in einem DataGridView (dataGrid2) alle
Konfigurationen mit Ihren Informationen angezeigt (Name, Erstelldatum,
Ersteller).

Klickt man auf eine der Konfigurationen, sollen in einem weiteren
DataGridView (dataGrid3) diejenigen Zeilen aus "table1" zu sehen sein,
die dieser Konfiguration zugeordnet sind. In obigem Beispiel also alle
Parameter von "g1", "g2" und "g6".



dataGrid1/dataGrid2 sind per DataBinding angebunden:
-
string sqlSelectCommand = String.Format("SELECT * FROM {0}", TABLE_1);
DbDataAdapter adapter1 = dbManager.GetDataAdapter(sqlSelectCommand);

DbCommandBuilder cmd = dbManager.GetCommandBuilder(adapter1);
adapter1.InsertCommand = cmd.GetInsertCommand();
adapter1.UpdateCommand = cmd.GetUpdateCommand();
adapter1.DeleteCommand = cmd.GetDeleteCommand();

DataSet ds = new DataSet();
adapter.Fill(ds);

BindingSource bs = new BindingSource();
bs.DataSource = ds.Table[0];
dataGridView1.DataSource = bs;
-



Das Binding für dataGrid2 ist über einen eigenen Adapter mit seinem
eigenen SELECT-Statement realisiert. Das ermöglicht mir die Werte aus
"table1" bzw. "table2" unabhàngig voneinadern zu speichern.

-
adapter3.Fill(ds, "Table2");

DataRelation relation = new DataRelation("MyRelation",
ds.Tables[0].Columns[1], ds.Tables[1].Columns[0]);
ds.Relations.Add(relation);
-




Leider funktioniert das so, wie ich mir das hier gedacht habe, überhaupt
nicht. Jedenfalls schaffe ich es nicht, die Anbindung so zu gestalten,
dass beim Klick auf eine Konfiguration im dataGrid3 nur noch die
entsprechenden Konfigurationen aus "table1" angezeigt werden, die in
"table3" der angeklickten Konfiguration zugeordnet sind.


Wie macht man das denn? Bin langsam etwas am Verzeifeiln, da ich gar
keinen Anhaltspunkt habe, was ich falsch mache.
 

Lesen sie die antworten

#1 Peter Fleischer
15/06/2010 - 19:50 | Warnen spam
"Nico Wessels" schrieb im Newsbeitrag
news:
...
Wie macht man das denn? Bin langsam etwas am Verzeifeiln, da ich gar
keinen Anhaltspunkt habe, was ich falsch mache.



Hi Nico,
deine Tabelle "tabble3" ist Child-Tabelle sowohl zur Master-Tabelle "table1"
als auch zur Master-Tabelle "table2". Du kannst per Code natürlich eine
Abfrage starten und dann genau das anzeigen, was gewünscht ist. Ohne Code
geht es aber auch recht einfach, wenn du Ausdrucks-Spalten in "table3"
hinzufügst und diese zur Anzeige in deinem Grid3 nutzt. Mit der Auswahl im
Grid1 oder Grid2 (je nach gewünschter Unterordnung für die Anzeige) werden
dann im Grid3 alle zum ausgewàhlten Master-Datensatz gehörenden Datensàtze
aus "table3" und die Ausdrucksspalten angezeigt, die Inhalte des
entsprechenden Parents anzeigen.

Viele Gruesse

Peter

Ähnliche fragen