none
DataGridView mit Feldern aus mehreren Tabellen als Detail? RRS feed

  • 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 :-D

    Vielen Dank vorab und beste Grüsse
    Christina

     

    Mittwoch, 2. Juni 2010 12:18

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

    Freitag, 4. Juni 2010 08:14
    Beantworter
  • 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/Slave

    Die 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)

    Freitag, 4. Juni 2010 08:39

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

    Freitag, 4. Juni 2010 08:14
    Beantworter
  • 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/Slave

    Die 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)

    Freitag, 4. Juni 2010 08:39
  • 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

    Dienstag, 29. Juni 2010 13:19
  • 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 

     

    Mittwoch, 30. Juni 2010 08:59
  • 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

    Mittwoch, 30. Juni 2010 09:25
    Beantworter
  • 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

    Mittwoch, 30. Juni 2010 13:40
  • 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

    Mittwoch, 30. Juni 2010 14:33
    Beantworter
  • Hallo Elmar,

    vielen Dank, ich werd's ausprobieren.

    Gruss

    Christina

    Dienstag, 6. Juli 2010 15:27
  • 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

    Mittwoch, 29. September 2010 10:22