1

我有一个使用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
4

2 回答 2

6

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

我有同样的问题,但使用 vb.net。

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

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

希望它会有所帮助。

于 2016-01-21T10:49:26.210 回答
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

不太可能是简单列表的情况:

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

dgvBookings.DataSource = newList

您提供的信息少于预期(一维与预期的二维),因此结果不是您想要的。您需要提供更多信息;例如:您可以一一添加行,而不是依赖 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
于 2013-08-05T11:45:46.187 回答