2016-06-22 8 views
-1

Ich habe eine listbasierte Anwendung, die sehr langsam ausgeführt wird, da jede Zeile in meiner DataGridView manuell als DataGridViewRow erstellt wird. Um Performance-Probleme zu beheben, entschied ich mich stattdessen eine DataSource (DataTable) zu verwenden.DataGridView DataSource // Ganzzahl zu Symbol

Mein Problem:

Eine Spalte ich aus meiner Datenbank bin recieving mit Bild-IDs gefüllt ist. Die Anwendung weiß, welches Bild zu welcher ID gehört. Beim manuellen Erstellen von Gridrows gab es kein Problem beim Konvertieren von int in eine Bitmap und beim Verwenden der Bitmap als Wert für eine Bildspalte. Jetzt kann ich das Datatable stattdessen verwenden, es funktioniert nicht. Für den Test habe ich die folgende Klasse:

Public Class test 
Dim img As Bitmap 

Public Sub New(image As Bitmap) 
    InitializeComponent() 
    Me.img = image 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim dt As New DataTable 
    dt.Columns.Add("StrCol") 
    dt.Columns.Add("ImgCol") 
    Dim row As DataRow = dt.NewRow 
    row.Item(0) = "Ohne Bild" 
    row.Item(1) = 0 
    Dim row2 As DataRow = dt.NewRow 
    row2.Item(0) = "Mit Bild" 
    row2.Item(1) = 1 
    dt.Rows.Add(row) 
    dt.Rows.Add(row2) 
    DataGridView1.DataSource = dt 
End Sub 

Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting 
    If e.ColumnIndex = 1 Then 
     If e.Value = 0 Then 
      e.Value = Nothing 
     Else 
      e.Value = img 
     End If 
    End If 
End Sub 
End Class 

Hinweis:

  • "Ohne Bild" übersetzt "Ohne Bild"
  • "Mit Bild" übersetzt "Mit Bild"

Ausgabe nach Button1_Click() Output after Button1_Click()


EDIT

Wegen eines Missverständnis werde ich versuchen, meine Frage zu klären;

Mit listenbasiert meine ich eigentlich nicht das Listenobjekt. Mein schlechtes dort. Mit listenbasiert meine ich eine Anwendung, die den Benutzer Database-Einträge anzeigt, die er gemacht hat. Das grundlegende meiner Anwendung ist einfach: Erlaubt dem Benutzer, Zeilen hinzuzufügen, zu bearbeiten und Zeilen in einer Datagridview zu löschen. Diese Information wird in einer Datenbank gespeichert und bearbeitet. Einige dieser Informationen in den Zeilen (2 Spalten, um genau zu sein) werden als Symbole angezeigt, während die Anwendung einfach eine ID für das Symbol in der Datenbank speichert. Die Anwendung weiß also, welche ID zu welchem ​​Symbol gehört.

Das Beispiel dt in der Frage ist nur etwas zu arbeiten. In der Anwendung werden Daten von einer Datenbank zu einer Datentabelle empfangen.

+0

Eine Bild-ID wird nicht automatisch in ein Bild übersetzt. Wo werden die Bilder gespeichert? – Plutonix

+0

@Plutonix Ich habe nicht versucht, das CellFormatting-Ereignis zum Spaß zu überschreiben :-) Die Bilder/Icons werden, wie Sie sehen können, in einem Instanz-Member gespeichert, das im Konstruktor definiert ist. – Luke

Antwort

0

Ich habe es endlich selbst gelöst.

  1. Ich bekomme eine Datentabelle aus meiner Datenbank.
  2. Dann füge ich eine Spalte um es mit dem Datentyp Bitmap
  3. dann durch jede Reihe der Datentabelle I Schleife und die image_id Spalte zu dem Bild selbst und das Bild in die neue Spalte
  4. Dann entfernen setzen übersetzen I die image_id Spalte
  5. Dann benutze ich die neue Datatable als Datasource

ich diesen Code in meiner Haupt-Anwendung erstellt, die viel komplexer ist, so kann ich hier den Code nicht zeigen. Entschuldigung und danke für deine Hilfe.

Es ist wichtig, alle notwendigen Änderungen vor der Verwendung der Tabelle als Quelle durchzuführen, da sobald das GridView etwas ändern muss, das angezeigt wird, viel mehr Zeit benötigt wird.

Verwandte Themen