Benutzer mit den meisten Antworten
DataGridView mit Feldern aus mehreren Tabellen als Detail?

Frage
-
Hallo liebe VB-Spezialisten,
in meiner Anwendung VB 2005 brauche ich eine Master-Detail-Darstellung, in der der Detail-Teil aus mehreren Access XP Tabellen besteht:MASTER Textfelder: Feld SNR Schulung Tabelle Schulung Schulung DETAIL DGV: Feld Bereich Name Vorname Absolviert Angelegt Tabelle Bereiche Personal Personal P_Schulung P_Schulung Beziehung Personal.BNr Personal.PNr Personal.PNr Schulung.SNr Schulung.SNr Bereiche.BNr P_Schulung.PNr P_Schulung.PNr P_Schulung.SNr P_Schulung.SNr
Im DGV sollen alle Felder nebeneinander angezeigt werden.
Alle Textfelder und DGV-Zellen sollen ReadOnly sein, nur in die Spalte "Absolviert" soll man ein Datum eintragen können, das dann in die Tabelle P_Schulung ins Feld "Absolviert" übernommen wird.Verschiedene Versuche meinerseits sind alle gescheitert :-(
Deshalb meine Frage an Euch Spezialisten: gibt es überhaupt eine Möglichkeit, so etwas zu verwirklichen?
Über Eure Hilfe würde ich mich sehr freuen. Wenn Ihr aber in den nächsten 3 Wochen keine Rückmeldung bekommt, wundert Euch bitte nicht, denn da bin ich im Urlaub :-DVielen Dank vorab und beste Grüsse
Christina
Antworten
-
Hallo Christina,
febunden werden kann direkt nur an eine DataTable, die alle Spalten enthalten muß.
Was man über berechnete Spalten mit Hilfe von Relationen erreichen kann,
siehe DataColumn.Expression und dort insbesondere CHILD und PARENT.Eine Alternative wäre eine DataGridViewComboBoxColumn , die unabhängige
DataSource/DataMember Eigenschaften bereitstellt.Gruß Elmar
- Als Antwort vorgeschlagen Thorsten DörflerModerator Donnerstag, 10. Juni 2010 19:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 15. Juni 2010 15:17
-
Hallo Christina,
ein DataGridView kann jeweils nur Daten aus einer einzigen DataTable/Dataview anzeigen.
In Deinem Fall könntest Du also erst mal eine DataTable (Master) mit den erforderlichen Daten aus Deiner DB-Tabelle "Schulung" füllen und eine zweite DataTable (Detail) mit den Daten aus Deinen DB-Tabelle "Bereiche", "Personal" u. "P_Schulung".Beide DataTables sollten in einem gemeinsamen DataSet liegen um nun zwischen den beiden DataTables eine Beziehung ("Relation") herstellen zu können.
Beispiele für das Herstellen solcher Relations und das Anzeigen der entspr. Daten in DataGridViews findest Du unter
www.gssg.de
-> DataGridView
-> DataGridView Relation (Rev: 01)
-> DataGridView Relation 3
-> DataGridView Master/SlaveDie beiden ersten Beispiele arbeiten mit Relation-Objekten, das dritte Beispiel (DataGridView Master/Slave) macht das ohne Relation-Objekt.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort vorgeschlagen Thorsten DörflerModerator Donnerstag, 10. Juni 2010 19:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 15. Juni 2010 15:17
Alle Antworten
-
Hallo Christina,
febunden werden kann direkt nur an eine DataTable, die alle Spalten enthalten muß.
Was man über berechnete Spalten mit Hilfe von Relationen erreichen kann,
siehe DataColumn.Expression und dort insbesondere CHILD und PARENT.Eine Alternative wäre eine DataGridViewComboBoxColumn , die unabhängige
DataSource/DataMember Eigenschaften bereitstellt.Gruß Elmar
- Als Antwort vorgeschlagen Thorsten DörflerModerator Donnerstag, 10. Juni 2010 19:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 15. Juni 2010 15:17
-
Hallo Christina,
ein DataGridView kann jeweils nur Daten aus einer einzigen DataTable/Dataview anzeigen.
In Deinem Fall könntest Du also erst mal eine DataTable (Master) mit den erforderlichen Daten aus Deiner DB-Tabelle "Schulung" füllen und eine zweite DataTable (Detail) mit den Daten aus Deinen DB-Tabelle "Bereiche", "Personal" u. "P_Schulung".Beide DataTables sollten in einem gemeinsamen DataSet liegen um nun zwischen den beiden DataTables eine Beziehung ("Relation") herstellen zu können.
Beispiele für das Herstellen solcher Relations und das Anzeigen der entspr. Daten in DataGridViews findest Du unter
www.gssg.de
-> DataGridView
-> DataGridView Relation (Rev: 01)
-> DataGridView Relation 3
-> DataGridView Master/SlaveDie beiden ersten Beispiele arbeiten mit Relation-Objekten, das dritte Beispiel (DataGridView Master/Slave) macht das ohne Relation-Objekt.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort vorgeschlagen Thorsten DörflerModerator Donnerstag, 10. Juni 2010 19:05
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 15. Juni 2010 15:17
-
Hallo Peter, hallo Elmar,
jetzt funktioniert es:
1. Neue DataTable mit den verknüpften Feldern aus "Personal" und "Bereiche"
2. Diese mit DataGridViewComboBoxColumns in das DGV eingebaut.
Vielen Dank für Eure Unterstützung und beste Gruesse
Christina -
Hallo Zusammen,
jetzt bin ich doch noch auf ein Problem gestossen. Wenn ich die Spalte mit den DGV-ComboBoxColumns sortiere, wird natuerlich die darunterliegende Nummer (Value-Member) sortiert und nicht die angezeigte Bezeichnung (Display-Member). Deshalb erscheint der angezeigte Text nach wie vor unsortiert.
Auch der Versuch, die Sortierung per Code zu steuern, bringt nicht das gewuenschte Ergebnis:
Me.P_SchulungenDataGridView.Sort(P_SchulungenDataGridView.Columns(2), System.ComponentModel.ListSortDirection.Ascending)
Gibts da noch eine Moeglichkeit, den angezeigten Text (Display-Member) zu sortieren, unabhaengig vom Value-Member?
Vielen Dank und beste Gruesse
Christina -
Hallo Christina,
wenn Du für die ComboBox-Spalte eine BindingSource verwendest
und die Sort Eigenschaft auf das Displaymember festlegst,
sollte die Sortierung danach erfolgen.
Eine Alternative wäre eine DataView mit entsprechender Sort-Bedingung.Gruß Elmar
-
Hallo Elmar,
ich fürchte, das was ich brauche ist nicht zu verwirklichen. Ich brauche im DGV Daten aus verschiedenen Tabellen, die mit Klick auf die jeweilige Header-Zellen der Spalten sortiert werden. Diese Spalten müssen nur angezeigt werden. Dazu kommt jedoch eine Spalte, deren Daten müssen vom Benutzer geändert werden können.
Nehme ich einen neue DataTable, kann ich zwar sortieren, aber die Daten in dieser einen Spalte nicht ändern, bzw. werden die Änderungen nicht in die entsprechende Accesstabelle übernommen. Mache ich es so, wie ich heute morgen geschrieben habe, kann ich die Daten zwar ändern, aber nicht per Klick die anderen Spalten sortieren.Einen DataView mit allen benötigten Feldern habe ich noch nicht versucht, weil - soweit ich weiss - der DataView nur ReadOnly ist und deshalb die Daten in der einen Spalte nicht geändert werden können?
Viele Grüsse
Christina -
Hallo Christina,
eine DataView wird auch bei der BindingSource verwendet,
und sie unterscheidet sich insofern nicht.
Berechnete (via Expression) Spalten lassen sich naturgemäß
nicht ändern, dafür müssen die dort zugrundliegenden Spalten
verändert werden.Wenn Du einen Mix brauchst, kannst Du eine neue DataTable
erstellen, wo Du die änderbaren Spalten reinkopierst (und nicht
nur berechnnest), dazu die Primärschlüsselspalten -
ggf. in der Anzeige ausblenden - um die Zeile im Original zu finden.
Um die Änderungen an die Originaltabelle weiterzuleiten kannst
Du das DataTable.ColumnChanged Ereignis verwenden.Gruß Elmar
-
Hallo Zusammen,
ich habe mir jetzt eine neue Tabelle gebaut mit allen benötigten Feldern aus verschiedenen Tabellen. Den Update in die Original-Tabellen erledige ich mit einem Update-Query. Ist zwar eine "Krücke", aber es funktioniert.
Vielen Dank nochmals für eure Tipps.
Gruss
Christina