DataGridViewImageCell

  • VB.NET

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

    DataGridViewImageCell

    Hallo an Alle,



    ich bin ganz neu hier und habe sehr wenig programmiererfahrung. Entschuldigt wenn ich dumme Fragen stelle.

    Ich möchte in einem datagridview sehr viele zeilen(bis zu 1000) anzeigen. Wobei jede zeile eines von zwei Bildern enthalten soll. Nun habe ich das eigentlich schon gelöst und es funktioniert auch. Mein Problem ist, daß es sehr langgsam läuft. Hat jemand einen leicht verstänlichen Tip wie man das Laden der Bilder beschleunigen könnte? Die Bilddateien sind schon sehr klein, da möchte ich eignetlich nicht weiter sparen.

    Unten ist mal ein Ausschnitt meines Codes, aus dem heraus glaube ich das Problem hervorgeht.

    Danke, Theo

    VB.NET-Quellcode

    1. Private Sub LayerEinAus_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Dim Mylayers As LayerTable
    3. Dim MylayerEnumerator As SymbolTableEnumerator
    4. Dim Mylayer As LayerTableRecord
    5. Dim MyRow As DataGridViewRow
    6. Dim Row As Integer
    7. MyData = DataGridView1
    8. AllLayers = New CollectionMyOnCell = My.Resources.LampeEIN
    9. MyOffcell = My.Resources.LampeAUSUsing acTrans As Transaction = acDoc.Database.TransactionManager.StartTransaction()Mylayers = acDoc.Database.LayerTableId.GetObject(OpenMode.ForRead)
    10. MylayerEnumerator = Mylayers.GetEnumerator
    11. While MylayerEnumerator.MoveNextMylayer = MylayerEnumerator.Current.GetObject(OpenMode.ForRead)
    12. AllLayers.Add(Mylayer, Mylayer.Name)
    13. Row = MyData.Rows.Add()
    14. MyRow = MyData.Rows(Row)
    15. MyRow.Cells(0).Value = Mylayer.Name
    16. If Mylayer.IsOff = False And Mylayer.IsFrozen = False Then
    17. MyRow.Cells(1).Value = MyOnCell
    18. MyRow.Cells(1).ToolTipText = "AN"
    19. Else
    20. MyRow.Cells(1).Value = MyOffcell
    21. MyRow.Cells(1).ToolTipText = "AUS"
    22. End If
    23. End WhileMyData.Sort(MyData.Columns(0), System.ComponentModel.ListSortDirection.Ascending)
    24. End Using
    25. End Sub

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

    @Theo37: Willkommen im Forum. :thumbup:
    Kannst Du bitte mal Deinen Code so formatieren, dass wir ihn per C&P, ohne ihn nachbearbeiten zu müssen, in ein Projekt kopieren können?
    Nutze dazu bitte den [VB]-Button über dem Post-Editor.
    Drück auf den [VB]-Button,
    kopiere den Quellcode aus Deinem Studio
    füge den Code im Forum-Editor ein.
    Drück auf den Vorschau-Button unter dem Post-Editor.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    jo, Code hin oder her (also wirklich: Bitte VB-Tag benutzen - aber richtig)

    Ansonsten kann man die Anforderung entweder über Databinding erfüllen, oder mit OwnerDrawing.
    Jedenfalls musst du komplett davon wegkommen, Daten in DGV-Zellen zu verfüllen.
    bastel dir ein typisiertes Dataset, binde das DGV daran, und fülle Daten nurnoch ins Dataset.
    Bei richtig gemacht, macht die ImageColumn ihren Job, ohne das iwas weiter dran rumzufummeln wäre.

    typisiertes Dataset

    Hallo euch Beiden,



    das mit dem VB-Button,wußte ich nicht. Mache ich das nächste mal so.

    Zu dem "typisiertes Dataset". Geht die Zuweißung damit schneller? Das wäre mir sehr recht.

    Gibts irgend wo ein einfaches Beispiel, das ich auf meinen Fall anpassen könnte?

    Danke, Theo

    Theo37 schrieb:

    Mache ich das nächste mal so.
    Nutze bitte den Bearbeiten-Button Deines 1. Posts und mach es bitte dort.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gibts irgend wo ein einfaches Beispiel, das ich auf meinen Fall anpassen könnte?
    also ich hab mich sehr viel im Tutorial-Bereich Datenbanken zu typDataset verbreitert, weil das ist eine Programmier-Welt, die einem großen Teil der Progger schlicht unbekannt ist.

    Aber grad zu deiner eiglich simplen Anforderung habich nix, wohl weil das eiglich zu einfach ist.
    Aber gugge etwa Datagridview, aussehend wie Listview - da habich Aufwand getrieben, um das Image in dieselbe Zelle zu stopfen, ich füge die Simpel-Lösung da demnächst mal zu.

    Geschwindigkeit

    Hallo ErfinderdesRades,

    nach einigem Probieren, habe ich die Sache zum Laufen gebracht. Funktioniert gut.

    Nur es ist ehr langsamer geworden. Eigentlich hat sich ja nichts verändert nur daß das Laden der Bilder jetzt in der DataGridView1_CellFormatting statt findet. Am Vorgang und damit auch am Zeitbedarf hat sich nichts geändert. Kann natürlich gut sein, daß ich etwas falsch mache und falsch verstanden habe.

    Ich glaube daß es gut wäre für jede mögliche Zeile eine Mustezeile zu erstellen (2Stück) und das Datagridview dann mit diesen Musterzeilen zu füllen. ich kriege es aber nicht hin die Zeilen zu kopieren, zu clonen oder was auch immer. ich kann jede Zeile nur einmal ins Datagridview einfügen. wenn ich sie zum zweiten mal einfügen will, krieg ich ne Fehlermeldung.

    Könntest Du mir zeigen wie ich eine Datagridviewrow oder Datagridviewcell kopiere so daß ich sie nur einmal erstellen muß, aber mehrfach verwenden kann.?

    Gruß, Theo

    hast du mein Tut ausprobiert?
    Wie lange braucht das, um 1000 Zeilen zu laden?

    ah, und ärgerlich, wie jämmerlich du deinen Post editiert hast: Bitte VB-Tag benutzen - aber richtig

    Es ist möglich, Code so aussehen zu lassen, wie er im VS dargestellt ist.
    Das zeigt eiglich gleich, inwieweit Hinweise ühaupt bei dir ankommen, und also ob dir ühaupt zu helfen ist.

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

    Ich hoffe schon daß mir noch zu helfen ist. Nicht jeder ist als Programierer geboren. Aber ich bin lernfähig. Unten ein Versuch mit CellTemplate. Leider werden die Bilder nicht angezeigt, sondern nur rote Kreuze.

    Gruß Theo




    VB.NET-Quellcode

    1. Private Sub LayerEinAus_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Dim Mylayers As LayerTable
    3. Dim MylayerEnumerator As SymbolTableEnumerator
    4. Dim MyRow As DataGridViewRow
    5. Dim Mycolumn As DataGridViewColumn
    6. Dim Row As Integer
    7. MyData = DataGridView1
    8. Mycolumn = MyData.Columns(1)
    9. AllLayers = New Collection
    10. MyOnCell = New DataGridViewImageCell
    11. MyOnCell.Value = My.Resources.LampeEIN
    12. MyOnCell.ToolTipText = "AN"
    13. MyOffcell = New DataGridViewImageCell
    14. MyOffcell.Value = My.Resources.LampeAUS
    15. MyOffcell.ToolTipText = "AUS"
    16. Using acTrans As Transaction = acDoc.Database.TransactionManager.StartTransaction()
    17. Mylayers = acDoc.Database.LayerTableId.GetObject(OpenMode.ForRead)
    18. MylayerEnumerator = Mylayers.GetEnumerator
    19. While MylayerEnumerator.MoveNext
    20. Mylayer = MylayerEnumerator.Current.GetObject(OpenMode.ForRead)
    21. AllLayers.Add(Mylayer, Mylayer.Name)
    22. If Mylayer.IsOff = False And Mylayer.IsFrozen = False Then
    23. Mycolumn.CellTemplate = MyOnCell
    24. Else
    25. Mycolumn.CellTemplate = MyOffcell
    26. End If
    27. Row = MyData.Rows.Add()
    28. MyRow = MyData.Rows(Row)
    29. MyRow.Cells(0).Value = Mylayer.Name
    30. End While
    31. MyData.Sort(MyData.Columns(0), System.ComponentModel.ListSortDirection.Ascending)
    32. End Using
    33. End Sub

    Theo37 schrieb:

    Ich hoffe schon daß mir noch zu helfen ist.
    Das sehe ich pessimistischer.
    Vor allem, weil du meine Fragen aus post#9 vollkommen ignorierst.
    Und also statt einem Ansatz zu probieren, der nachweislich funktioniert, deinen eigenen für mich nicht nachvollziehbaren Weg weiter-verfolgst, als gäbe es ühaupt keinen Dialog (und den gibts ja insofern tatsächlich nicht).
    Also du führst Selbstgespräche.