Qu'est-ce WinForm contrôle à BIND List (Of T)?
-
21-08-2019 - |
Question
Je travaille sur des choses en gardant orienté objet pour mon projet. À l'heure actuelle, je suis sur un .DLL qui fournit toutes les classes de l'application aux WinForms projet agissant comme couche de présentation.
Mon .DLL sera, par exemple, un retour SortableBindingList (Of T) au code sous une forme. Le SortableBindingList (Of T) vient de . Supposons un SortableBindingList (de produits). En supposant que la fonction de .DLL retourne un SortableBindingList Services.Products.GetList()
(de produits), je peux le faire facilement:
DataGridView1.DataSource = Services.Products.GetList()
Maintenant, le DataGridView est correctement rempli avec ma liste de produits. Bien. Cependant, il n'y a pas de propriété .SelectedItem qui me redonne mon objet qui a été sélectionné dans le 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!
Cependant, un ComboBox ou ListBox ne en magasin et fait retourner mon produit intact objets:
' Valid!
ComboBox1.DataSource = Services.Products.GetList()
Dim p as Product = ComboBox1.SelectedItem
Une autre ... Mais la ComboBox et ListBox ne montrent pas tous les champs de l'objet produit, seule la valeur de la propriété DisplayMember.
Y at-il un contrôle agréable dans VB.NET 2008 que je manque juste, ce qui me donne la fonctionnalité orientée objet que je veux qui affiche effectivement les champs d'un objet entier et également de retour cet objet en arrière lorsqu'il est sélectionné par l'utilisateur? Je suis à une perte pour expliquer pourquoi il n'y aurait pas.
La solution
On dirait que vous cherchez SelectedRows propriété. Vous devriez pouvoir l'utiliser pour ce que vous décrivez.
Vous l'utilisez pour obtenir le DataBoundItem jeté alors que votre classe d'origine. Disons que j'avais une liste d'objets produits liés, je voudrais utiliser quelque chose comme:
Dim p As Product = CType(dataGridView1.SelectedRows(0).DataBoundItem, Product)
MessageBox.Show(p.Name & " " & p.Price)
Cela fonctionne si la ligne entière est sélectionnée, sinon vous pourriez obtenir une exception de référence null. Dans ce cas, vous pouvez obtenir les RowIndex de la cellule actuellement sélectionnée via:
dataGridView1.SelectedCells(0).RowIndex
Alors tous ensemble cela ressemble maintenant à:
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: mis à jour VB.NET