Pregunta

He estado trabajando en mantener las cosas orientado a objetos para mi proyecto. Actualmente, estoy usando un DLL que suministra todas las clases de la aplicación a la WinForms proyecto de actuar como la capa de presentación.

Mi .DLL será, por ejemplo, devolver una SortableBindingList (Of T) de código en un formulario. El SortableBindingList (Of T) viene de aquí . Vamos a suponer un SortableBindingList (de producto). Suponiendo que la función del DLL Services.Products.GetList() devuelve un SortableBindingList (de producto), puedo hacer esto fácilmente:

DataGridView1.DataSource = Services.Products.GetList()

Ahora, el DataGridView se rellena correctamente con mi lista de los productos. Multa. Sin embargo, no hay ninguna propiedad .SelectedItem la que me devuelve mi objeto que fue seleccionado en el 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!

Sin embargo, un ComboBox o ListBox hace en la tienda hecho y devolver objetos intacta mi producto:

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

Otra embargo ... el cuadro combinado y cuadro de lista no muestran todos los campos del objeto del producto, sólo el valor de la propiedad DisplayMember.

¿Hay un buen control de VB.NET en 2008 que sólo estoy perdiendo, lo que me da la funcionalidad orientada a objetos que quiero que en realidad va a mostrar los campos de un objeto entero y también devolver ese objeto de nuevo cuando sea seleccionado por el usuario? Estoy en una pérdida de por qué no habría.

¿Fue útil?

Solución

Parece que usted está buscando de DataGridView SelectedRows propiedad . Usted debe ser capaz de utilizarlo para lo que estás describiendo.

Se utiliza para obtener la DataBoundItem continuación, elenco que a su clase original. Vamos a decir que tenía una lista de objetos producto unido, me gustaría utilizar algo como:

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

Esto funciona si se selecciona toda la fila, de lo contrario podría obtener una excepción de referencia nula. En ese caso, usted podría conseguir los rowIndex de la celda actualmente seleccionada a través de:

dataGridView1.SelectedCells(0).RowIndex

Así que todos juntos esto ahora se ve así:

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: actualizado para VB.NET

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top