DataGrid mit MsSQL über mehrere Forms und INNER JOIN

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    DataGrid mit MsSQL über mehrere Forms und INNER JOIN

    Hallo liebe Leute,
    zur Zeit arbeite ich an einem kleinen Projekt (Für euch sicher nix großes).
    Bisher habe ich durch ErfinderDesRads etwas vermehrt Unterstützung erhalten (Siehe Thread:
    SQLAdapter und DataTable bei Update/Insert neue ID)

    Nun habe ich mein Projekt etwas umgebaut und soweit zufrieden. Zur Zeit hapert es aber an einem Darstellungsproblem. Erst mal ein zwei Bildchen :)

    Übersicht der Arbeitskleidungen. Wenn ich eine Row anklicke, wird mir aus dem typisierten DataSet der Mitarbeiter aus der Fremdschlüsseltabelle angezeigt.
    Das Problem erkennt man: Ich kann keinen InnerJoin darstellen bzw. das entsprechende Feld liegt ja in einer anderen Tabelle.


    Anlegen eines neuen Datensatzes. Durch das DataSet erhalte ich direkt die Änderungen. An der Stelle sieht man bereits das anstelle des Typs (Hemd, Hose etc.) nur die ID angezeigt wird.
    Um mir hier Mitarbeiter und Typen anzuzeigen, lade ich mir aus dem typisierten DataSet die Tabelle Mitarbeiter und Typ.


    Hier die Beziehungsübersicht aus dem SQL-Server




    Hier mal etwas Code:

    DataGrid (XAML)
    Spoiler anzeigen

    XML-Quellcode

    1. <DataGrid Grid.Row="1" CanUserAddRows="False" CanUserDeleteRows="True" x:Name="ArbeitskleidungDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding }" RowDetailsVisibilityMode="VisibleWhenSelected" ColumnWidth="AUto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
    2. <DataGrid.Columns>
    3. <DataGridTextColumn x:Name="IdColumn" Binding="{Binding kleidNr}" Header="Id" />
    4. <DataGridTextColumn x:Name="FarbeColumn" Binding="{Binding Farbe}" Header="Farbe"/>
    5. <DataGridTextColumn x:Name="SizeColumn" Binding="{Binding Size}" Header="Größe"/>
    6. <DataGridTextColumn x:Name="BemColumn" Binding="{Binding Bemerkung}" Header="Bemerkung"/>
    7. <DataGridTextColumn x:Name="TypColumn" Binding="{Binding Typ}" Header="Typ" />
    8. <DataGridComboBoxColumn x:Name="TypCMB" ></DataGridComboBoxColumn>
    9. <DataGridTemplateColumn>
    10. <DataGridTemplateColumn.CellTemplate>
    11. <DataTemplate>
    12. <Button CommandParameter="{Binding Path=kleidNr}" Content="X" Width="20" Height="20" Background="#FFFF0606" ></Button>
    13. </DataTemplate>
    14. </DataGridTemplateColumn.CellTemplate>
    15. </DataGridTemplateColumn>
    16. </DataGrid.Columns>
    17. </DataGrid>


    Laden der DataSets mit der SQLPersistance von ErfinderDesRads
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub laden()
    2. _Persistance = New SqlPersistance(_connectionString, ds)
    3. 'dv.Table = ds.Tables("Kleidung")
    4. ArbeitskleidungDataGrid.DataContext = ds.Kleidung
    5. _Persistance.FillAll()
    6. End Sub


    Code zum Anzeigen des u.s. Mitarbeiters (Hier auch wieder das Problem mit der JoinView)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ArbeitskleidungDataGrid_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ArbeitskleidungDataGrid.SelectionChanged
    2. For Each Item As DataRowView In ArbeitskleidungDataGrid.SelectedItems
    3. Dim kleidID = Item.Item(0).ToString()
    4. 'ids ermitteln: Item.Item(0).ToString()
    5. dv = New DataView(ds.Tables("mitarbeiter_kleidung"))
    6. dv.RowFilter = "Convert(kleid, 'System.String') LIKE '" & kleidID & "*'"
    7. ArbeitskleidungMitarbeitergrid.DataContext = dv
    8. Next
    9. End Sub


    Anzeige des "Neuen Kleid" Dialogs. Hier wird das DataSet, die SQLPersistance Klasse zum speichern und (das war nur ein Test) das sender Object übergeben.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    2. 'Dataset und Schreibfunktion (Persistance übergeben)
    3. Dim neueKLeid As New NeueKleidung(ds, _Persistance, Me)
    4. neueKLeid.ShowDialog()
    5. End Sub

    Übergeben werden diese Paramter mit ByRef als Referenz auf das bestehende Objekt (Ist das so richtig ausgedrückt?)

    Nun wie gesagt, ich habe Probleme beim Anzeigen über Join Views etc.
    Durch die referentielle Integrität kann ich Datensätze löschen die in der FS Tabelle ebenfalls entfernt wird.

    Hoffe ihr könnt mir weiter helfen, tipps spenden :)
    hier zeigt sich einer der Nachteile, wenn man gleich mit Datenbanken entwickelt:
    Du bist vmtl. zunächstmal ausserstande, ein Testprojekt anzuhängen, denn einen SqlServer kann man nicht anhängen.
    Mit einem typDataset alleine wäre es kein Problem, weil das speichert sich ja einfach als Xml-Datei ab.

    Ohne dein Projekt sehe ich aber nicht, dass man dir die geeigneten Bindings aufzeigen kann, weil dazu braucht man dein Viewmodel (in der Hoffnung, dass du ein solches verwendest) etc.
    Also meine Empfehlung: Lade mal die Db komplett ins Dataset, und speicher das Dataset dann mit .WriteXml ab - dann hast du die Daten schoma in portablem Format vorliegen.

    Dann bastel einen Knopf drann, der die Daten statt aus der Db aus dieser Xml lädt - mit Dataset.ReadXml.
    Wenn du das gebacken hast, kannst du ein lauffähiges Projekt anhängen, denn der SqlServer ist dann nicht mehr erforderlich.

    Weil dein Prob hat mit der Daten-Beschickung gar nix zu tun - es sind die Bindings, die nicht stimmen. Aber du hast deine Entwicklung nun dummerweise fest an den SqlServer gekoppelt , tja...

    Hier inne Vorbemerkung gibts weitere Argumente für diesem Ansatz - ich nenne ihn den "DatasetOnly"-Ansatz: Daten laden und speichern
    Hallo !
    im Anhang habe ich mal das ganze Projekt angefügt.
    Ich habe einen Button eingefügt der mir die DB als XML gespeichert hat. Beim laden des Fensters lädt er die Werte aus der XML Datei samt Schema.

    Link editiert :) Hab das Projekt angehangen.

    Danke euch!
    Dateien
    • workwear.zip

      (623,81 kB, 137 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schwakowiak“ ()

    Hier meine Bearbeitung des einen Windows.
    Aber du solltest wirklich die Architektur umstellen auf den MVVM.
    Ansatzweise repariert sind die Bindings nur des einen Fensters, aber deine Windows müssen alle ans selbe typisierte Dataset angebunden sein, sonst weiß die eine Hand nicht, was die andere macht.
    Guck im Wpf-Bereich herum, alles zum Thema MVVM - vlt. wird dir das Muster klar, nach dem man vorgeht.

    Ich habe übrigens in Application.Xaml das StartWindow geändert, da wird man ja sonst ramdösig, sich da bei jedem Startup erstmal durchklicksen zu müssen.

    Ach und dein Dataset ist nur halb-lebig - es fehlt jede Relation zwischen den Tabellen.
    Ich hab ein paar zugefügt, und erfreulicherweise liess es sich laden.

    Dateien
    • workear00.zip

      (43,33 kB, 140 mal heruntergeladen, zuletzt: )