我一直致力于为项目保持面向对象。目前,我正在使用.DLL,它将所有应用程序的类提供给作为表示层的WinForms项目。
例如,我的.DLL会将SortableBindingList(Of T)返回给表单中的代码。 SortableBindingList(Of T)来自here。我们假设一个SortableBindingList(Of Product)。假设.DLL的函数Services.Products.GetList()
返回一个SortableBindingList(Of Product),我可以很容易地做到这一点:
DataGridView1.DataSource = Services.Products.GetList()
现在,DataGridView已正确填充了我的产品列表。精细。但是,没有.SelectedItem属性可以返回我在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!
但是,ComboBox或ListBox实际上确实存储并返回我的Product对象:
' Valid!
ComboBox1.DataSource = Services.Products.GetList()
Dim p as Product = ComboBox1.SelectedItem
然而另一个...... ComboBox和ListBox不显示Product对象的所有字段,只显示DisplayMember属性的值。
VB.NET 2008中是否有一个很好的控件,我只是缺少它,它为我提供了我想要的面向对象的功能,它实际上会显示整个对象的字段,并在用户选择时返回该对象?我不知道为什么没有。
答案 0 :(得分:2)
听起来你正在寻找DataGridView的SelectedRows property。您应该能够将其用于您所描述的内容。
您可以使用它来获取DataBoundItem,然后将其转换为您的原始类。假设我有一个绑定的Product对象列表,我会使用类似的东西:
Dim p As Product = CType(dataGridView1.SelectedRows(0).DataBoundItem, Product)
MessageBox.Show(p.Name & " " & p.Price)
如果选择了整行,则此方法有效,否则您可能会获得空引用异常。在这种情况下,您可以通过以下方式获取当前所选单元格的RowIndex:
dataGridView1.SelectedCells(0).RowIndex
所以这一切现在看起来像:
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
编辑:更新为VB.NET