什么WinForm控件绑定列表(T)?

时间:2009-07-01 17:50:21

标签: vb.net winforms oop presentation-layer

我一直致力于为项目保持面向对象。目前,我正在使用.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中是否有一个很好的控件,我只是缺少它,它为我提供了我想要的面向对象的功能,它实际上会显示整个对象的字段,并在用户选择时返回该对象?我不知道为什么没有。

1 个答案:

答案 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