如何将DataGridView绑定到自定义类列表

时间:2013-08-05 10:45:50

标签: vb.net winforms data-binding datagridview vb.net-2010

我有一个使用TableAdapter构建的自定义类列表。

我想将这些仅添加到DataGridView绑定某些列。

我已经尝试过以下代码来填充和绑定数据:

lAllBookings = (From r As DataRow In BookingsTableAdapter1.GetDataWithItems().Rows
                        Select New Booking With {.bookingID = r.Item("BookingID"), _
                                                 .itemID = r.Item("ItemID"), _
                                                 .bookedOutDate = r.Field(Of DateTime?)("BookedOutDate"), _
                                                 .bookedInDate = r.Field(Of DateTime?)("BookedInDate"), _
                                                 .identType = r.Item("IdentType"), _
                                                 .identString = r.Item("IdentString"), _
                                                 .image = r.Item("Image"), _
                                                 .complete = r.Item("Complete"), _
                                                 .notes = r.Item("Notes"), _
                                                 .itemName = r.Item("ItemName"), _
                                                 .itemBC = r.Item("ItemBarcode")}).ToList



        dgvBookings.Columns("BookingID").DataPropertyName = "bookingID"
        dgvBookings.Columns("ItemIdent").DataPropertyName = "itemName"
        dgvBookings.Columns("BookedOut").DataPropertyName = "bookedOutDate"
        dgvBookings.Columns("IdentString").DataPropertyName = "identString"


        dgvBookings.DataSource = lAllBookings

现在,当我这样做时,我得到正确的行数,但所有字段都是空白的。

我在SO和一些教程上遇到了一些问题,但它们似乎都与我需要的东西略有不同。

有没有办法可以使用我的项目列表填充DataGridView? 我宁愿避免使用DataSet,因为我已经在List<Of Class>类型上构建了很多其他代码。

编辑 - 这是类Booking声明:

Public Class Booking

    Public bookingID As Integer
    Public itemID As Integer
    Public itemName As String
    Public itemBC As String

    Public identType As Short
    Public identString As String
    Public image As Byte()
    Public complete As Boolean
    Public notes As String

    Public bookedInDate As DateTime?
    Public bookedOutDate As DateTime?

End Class

2 个答案:

答案 0 :(得分:4)

我知道你真的很晚,但也许它可以帮助别人。

我遇到的问题与你使用vb.net相同。

最后我找到了解决方案:你的类没有暴露属性而是暴露变量。绑定系统查找属性,无法找到它们,因此您可以获得空行。

尝试完成添加{get; set;}的类(或者使用vb.net时的属性属性),一切都会正常工作。

希望它有所帮助。

答案 1 :(得分:2)

我不确定您是否收到了IAllBookings您想要的所有信息。在任何情况下,您都没有正确地将其传递给dgvBookings。在这里,您有几个小代码可以帮助您了解其工作原理:

dgvBookings.Columns.Clear()    
Dim newTable As New DataTable

newTable.Columns.Add("Column1")
newTable.Columns.Add("Column2")
newTable.Columns.Add("Column3")

newTable.Rows.Add("1", "2", "3")
newTable.Rows.Add("1", "2", "3")
newTable.Rows.Add("1", "2", "3")

dgvBookings.DataSource = newTable

newTable完全模仿DataGridView结构(列和行),因此可以直接以DataSource形式提供。

不太可能是一个简单的List:

dgvBookings.Columns.Clear()
Dim newList = New List(Of String)
newList.Add("1")
newList.Add("2")
newList.Add("3")

dgvBookings.DataSource = newList

您提供的信息少于预期(1D与预期的2D),因此结果不是您想要的。您需要提供更多信息;例如:您可以逐个添加行,而不是依赖于DataSource:

dgvBookings.Columns.Add("Column1", "Column1")
For Each item In newList
    dgvBookings.Rows.Add(item)
Next

我希望这个答案可以帮助您更好地了解如何处理DataGridView以及不同的数据源。

- 更新

逐行选项应用于您的特定情况。

For Each item As Booking In lAllBookings
    With item
        dgvBookings.Rows.Add(.bookingID.ToString(), .itemID.ToString(), .bookedOutDate.ToString(), .identString.ToString())
    End With
Next