Daten aus 2 Tabellen darstellen bzw. eine andere elegante Lösung

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Daten aus 2 Tabellen darstellen bzw. eine andere elegante Lösung

    Einen guten Abend liebe Forum Gemeinde,

    ich benötig mal etwas Starthilfe, denn ich habe noch keinen vernünftigen Weg gefunden um die folgende Aufgabe zu lösen.

    Ziel: In einem DGV Daten anzeigen, wobei es sich in einer Column um ein Bild handelt.

    Derzeit liegen die Daten als Typisiertes Dataset zu Grunde.
    Die Bilder stehen als Byte() zur Verfügung. Das hatte ich in diesem Thread schon gelöst:
    https://www.vb-paradise.de/index.php/Thread/132360-Graphics-in-dataset-schreiben-und-im-dgv-anzeigen/?postID=1143669#post1143669

    Bei den Daten handelt es sich um eine Liste, welche einem Bediener vorgibt, in welcher Reihenfolge er Bauteile auflegen muss.
    Und dem entsprechend möchte ich auch das Bauteil als Bild darstellen.
    Die Bauteile werden sich auch immer wieder wiederholen.

    Ich stelle mir also vor eine Tabelle mir der Beladeliste zu erstellen und eine, in der unter dem Bauteilnamen das Bild als Byte() liegt.
    Bis hier hin sehe ich nicht mein Problem.

    Aber wie bekomme ich das nun passend angezeigt?
    Oder fällt euch eine andere elegante Lösung ein?

    Ich bin auf Eure Ideen gespannt.
    "Mann" lernt mit seinen Projekten.
    Hm, das wäre mit DataBinding allein nicht möglich. Dazu müsste die betroffene Column ComboBoxColumn und ImageColumn zugleich sein, damit sie 2 Tabellen kombinieren und das Image anzeigen kann. Du könntest versuchen, selber einen entsprechenden ColumnType zu basteln. Aber ich glaub, dass es dann besser ist, die ImageColumn per Code/Hand selber zu füllen. Also im gewünschten EventHandler die BindingSource-/DataTable-Row herzunehmen, schauen, auf welchen Bildindex das Ganze verweist und dann das entsprechende Bild in die ImageCell zu hauen. Vielleicht geht auch was mit der keine Strings in die ListBox-Geschichte, aber dafür fehlen mir gerade die Gehirnzellen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Naja, man könnte gut das Formatting-Event heranziehen, wie hier zb gezeigt: Icons im DatagridView und das CellFormatting-Event
    Dort wird das Bild aus einem Array genommen - ich glaub aber, man könnte ebensogut den verknüpften Spaltenwert vom typ Byte() hernehmen - müsste man probieren.
    Ob das schön wird sei dahingestellt - üblicherweise sind DGV-Zellen ja bischen klein, um ein Bild vernünftig anzuzeigen.

    Also angenommen Tabellen Bauteil->BeladeItem, und Image-Spalte an ColumnIndex 0:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If e.ColumnIndex <> 0 Then Return
    3. Dim rwBeladeItem = DirectCast(DirectCast(bsBeladeItem(e.RowIndex), DataRowView).Row, BeladeItemRow)
    4. e.Value = rwBeladeItem.BauteilRow.Bild
    5. e.FormattingApplied = True
    6. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    DGV-Zellen ja bischen klein

    Och das geht schon. Auf nem 55 zoll und nur 15 Rows ist das gut zu erkennen.

    Wie wäre es mit dieser Variante:
    Dataset in dem meine Beladereihenfolge steht. Dort wird auch sofort mit jedem Datensatz ein leeres Byte() mit angelegt.

    Step 1 wäre dann, das die Beladung erst einmal ohne Bilder dargestellt wird.
    Sobald ich damit fertig bin, starte ich eine Backgroundworker, welcher sich um die Bilder kümmert.
    Dieser würde dann die Liste durchgehen und wenn das Bild noch nicht vorhanden ist, dann erst ein in einem seperatem Dataset dies ablegen und danach erst von dort das Byte() in das Haupt Dataset kopieren.

    Kurz etwas Hintergrund, weshalb ich das nicht direkt beim erstellen der Beladung mache. Zeit. Ich benötige mehrere sec. um eine DXF Datei auszulesen und in das Byte() umzuwandeln. Und es wäre nicht tragisch, wenn sich die Bilder erst nach und nach aufbauen. Zudem wären die Ja quasi mit der Zeit eine Art Sammlung, welche dann ja nur kopiert werden muss.

    Was meint Ihr dazu?

    Ich schon mal diese Variante probiert. Sieht ganz gut aus.
    Hier etwas code:

    VB.NET-Quellcode

    1. Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    2. For Each _row In DataSet1.LoadingTable
    3. Dim _SourceProfile = DataSet1.PictureTable.FindByProfile(_row.Profile)
    4. If _SourceProfile Is Nothing Then
    5. Dim DxfReader As New DxfReader
    6. DxfReader.ReadDxf(_PicturePath & _row.Profile & ".dxf", GrafikElementeDataSet, _row.Profile)
    7. Dim _NewPicture As DataSet1.PictureTableRow = DataSet1.PictureTable.NewPictureTableRow
    8. _NewPicture.Profile = _row.Profile
    9. _NewPicture.Picture = _dxf2byte(_row.Profile)
    10. DataSet1.PictureTable.Rows.Add(_NewPicture)
    11. _SourceProfile = DataSet1.PictureTable.FindByProfile(_row.Profile)
    12. _row.Picture = _SourceProfile.Picture
    13. Else
    14. _row.Picture = _SourceProfile.Picture
    15. End If
    16. Next
    17. BGW.CancelAsync()
    18. End Sub
    "Mann" lernt mit seinen Projekten.

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

    kiter20 schrieb:

    Backgroundworker
    Och, bitte nicht. Stichwort Async/Await

    kiter20 schrieb:

    einem seperatem Dataset
    Wozu? Man kann doch alles in einem halten.

    VB.NET-Quellcode

    1. If _SourceProfile Is Nothing Then
    2. '…
    3. _row.Picture = _SourceProfile.Picture
    4. Else
    5. _row.Picture = _SourceProfile.Picture
    6. End If

    ? ->

    VB.NET-Quellcode

    1. If _SourceProfile Is Nothing Then
    2. '…
    3. End If
    4. _row.Picture = _SourceProfile.Picture


    Aber bzgl. Deines Vorschlags, die Bilder zur Laufzeit ins DGV zu schieben: Probier es aus, könnte Dir vielleicht reichen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.