Pergunta

Eu tenho trabalhado em manter as coisas objeto orientado para o meu projeto. Atualmente, estou usando uma DLL que fornece todas as classes do aplicativo para os WinForms projeto atuando como camada de apresentação.

Meu DLL irá, por exemplo, devolver um SortableBindingList (Of T) para o código em um formulário. O SortableBindingList (Of T) vem aqui . Vamos supor que um SortableBindingList (Of Product). Assumindo que Services.Products.GetList() função da DLL retorna um SortableBindingList (Of Product), eu posso facilmente fazer isso:

DataGridView1.DataSource = Services.Products.GetList()

Agora, o DataGridView está devidamente preenchida com minha lista de produtos. Bem. No entanto, não há nenhuma propriedade .SelectedItem que dá-me o meu objeto que foi selecionado no 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!

No entanto, uma caixa de combinação ou uma caixa de listagem faz na loja verdade e devolver o meu produto objetos intactos:

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

Outro no entanto ... o ComboBox e ListBox não mostrar todos os campos do objeto de Produto, apenas o valor da propriedade DisplayMember.

Existe um controle agradável em VB.NET 2008, que eu estou faltando apenas, que me dá a orientada a objeto funcionalidade que eu quero que vai realmente mostrar campos de um objeto inteiro e também retornar esse objeto de volta quando selecionado pelo usuário? Eu estou em uma perda a respeito de porque não haveria.

Foi útil?

Solução

Parece que você está procurando do DataGridView SelectedRows propriedade . Você deve ser capaz de usar isso para o que você está descrevendo.

Você usá-lo para obter o DataBoundItem em seguida, lançar isso para sua classe original. Vamos dizer que eu tinha uma lista de produtos objetos vinculados, eu usaria algo como:

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

Isso funciona se toda a linha está selecionada, caso contrário você pode obter uma exceção de referência nula. Nesse caso, você poderia obter o RowIndex da célula selecionada via:

dataGridView1.SelectedCells(0).RowIndex

Então, todos juntos isso agora se parece com:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top