¿Qué control WinForm de obligar lista (Of T)?
-
21-08-2019 - |
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.
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