Frage

Ich habe auf das Halten von Sachen gearbeitet Objekt für mein Projekt orientiert. Derzeit bin ich mit einem DLL, die alle der App-Klassen auf die WinForms projizieren, die als die Präsentationsschicht liefert.

Meine .DLL- wird zum Beispiel eines SortableBindingList zurückkehren (Of T), um Code in einem Formular. Der SortableBindingList (Of T) kommt von hier . Lassen Sie uns einen SortableBindingList nehmen (Produkt). Unter der Annahme, dass die Funktion Services.Products.GetList() die .DLL einen SortableBindingList zurückgibt (Produkt), ich kann dies leicht tun:

DataGridView1.DataSource = Services.Products.GetList()

Nun wird die Datagridview richtig mit meiner Liste der Produkte bevölkert. Fein. Allerdings gibt es keine .SelectedItem Eigenschaft, die mir gibt mein Objekt zurück, die in der Datagridview ausgewählt wurde:

' Doesn't exist!
Dim p As Product = DataGridView1.SelectedItem
' Need to make another DB call by getting the Product ID 
' from the proper Cell of the DataGridView ... yuck!

Allerdings ist ein ComboBox oder List-Box in der Tat zu speichern und Rückkehr meiner Produkte Objekte intakt:

' Valid!
ComboBox1.DataSource = Services.Products.GetList()
Dim p as Product = ComboBox1.SelectedItem

Eine andere aber ... die ComboBox und ListBox zeigen nicht alle Felder des Product-Objekt, nur den Wert der Displaymember Eigenschaft.

Gibt es eine nette Kontrolle in VB.NET 2008, dass ich gerade fehlt, was mir die objektorientierte Funktionalität gibt, die ich will, die tatsächlich wird ein ganzes Objekt der Felder angezeigt werden und das Rück auch das Objekt zurück, wenn durch den Benutzer ausgewählt? Ich bin ratlos, warum würde es nicht sein.

War es hilfreich?

Lösung

Es klingt wie Sie für die Datagridview der SelectedRows Eigenschaft . Sie sollten die in der Lage sein zu verwenden, für das, was Sie beschreiben.

Sie verwenden es die DataBoundItem dann diese Klasse zu Ihrer ursprünglichen geworfen zu bekommen. Lassen Sie uns sagen, dass ich eine Liste von Produktobjekten hatte gebunden ist, würde ich so etwas wie verwenden:

Dim p As Product = CType(dataGridView1.SelectedRows(0).DataBoundItem, Product)
MessageBox.Show(p.Name & " " & p.Price)

Das funktioniert, wenn die gesamte Zeile ausgewählt ist, andernfalls Sie eine NULL-Verweis Ausnahme erhalten könnten. In diesem Fall können Sie die RowIndex der aktuell ausgewählten Zelle bekommen konnten über:

dataGridView1.SelectedCells(0).RowIndex

So alle zusammen jetzt die wie folgt aussieht:

If dataGridView1.SelectedCells.Count > 0 Then
    Dim index as Integer = dataGridView1.SelectedCells(0).RowIndex
    Dim p As Product = CType(dataGridView1.SelectedRows(index).DataBoundItem, Product)
    MessageBox.Show(p.Name & " " & p.Price)
End If

EDIT: aktualisiert VB.NET

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top