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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top