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

予想よりも少ない情報 (1D 対予想される 2D) を提供しているため、結果は希望するものではありません。さらに情報を提供する必要があります。たとえば、DataSource に依存する代わりに、行を 1 つずつ追加できます。

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 に答える