Domanda

Ho lavorato su come mantenere le cose orientato agli oggetti per il mio progetto. Attualmente, sto usando una DLL, che fornisce tutte le classi della App per le WinForms progetto in qualità di livello di presentazione.

Il mio DLL sarà, per esempio, restituire un SortableBindingList (Of T) per il codice in una forma. Il SortableBindingList (Of T) proviene da qui . Supponiamo che un SortableBindingList (di prodotto). Supponendo che la funzione del DLL Services.Products.GetList() restituisce un SortableBindingList (di prodotto), posso facilmente fare questo:

DataGridView1.DataSource = Services.Products.GetList()

Ora, DataGridView è adeguatamente popolata con la mia lista dei prodotti. Belle. Tuttavia, non v'è alcuna proprietà .SelectedItem che mi dà indietro il mio oggetto che è stato selezionato nel DataGridView:

' 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!

Tuttavia, un controllo ComboBox o un ListBox fa nel negozio di fatto e restituire oggetti intatta la mia prodotto:

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

Un altro però ... il ComboBox e ListBox non mostrano tutti i campi dell'oggetto prodotto, solo il valore della proprietà DisplayMember.

C'è un bel controllo in VB.NET 2008, che io sono solo manca, che mi dà la funzionalità orientata agli oggetti che voglio che effettivamente visualizzare i campi di un intero oggetto e anche restituire l'oggetto indietro quando selezionato dall'utente? Sono ad una perdita quanto a perché non ci sarebbe stato.

È stato utile?

Soluzione

Sembra che tu stia cercando il DataGridView SelectedRows proprietà . Dovreste essere in grado di utilizzare tale per quello che stai descrivendo.

Si utilizza per ottenere il DataBoundItem poi gettato che alla classe originale. Diciamo che ho avuto un elenco di oggetti del prodotto legato, vorrei usare qualcosa come:

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

Questo funziona se viene selezionata l'intera riga, altrimenti si potrebbe ottenere un'eccezione di riferimento null. In tal caso si potrebbe ottenere i RowIndex della cella attualmente selezionato tramite:

dataGridView1.SelectedCells(0).RowIndex

Quindi, tutti insieme adesso appare come:

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

Modifica aggiornato per VB.NET

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top