0

ボタンとデータグリッドビューを備えた Windows フォームがあります。このプロジェクトには、作業中のデータベース接続と LINQ to SQL クラスが含まれています。datagridview を LINQ to SQL にバインドしようとしています。

コードモジュールで私はこれを持っています:

Public Function DataGridList() As BindingSource
    Dim NewBindingSource As New BindingSource()
    Dim db As New DataClasses1DataContext()
    NewBindingSource.DataSource = _
    From Block In db.BLOCK_ASSIGNMENTs
        Where Block.gr912_school = "Franklin"
    Select Block.gr6_school Distinct
    Return NewBindingSource
End Function

この button_click コードは次の形式です。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    DataGridView1.DataSource = DataGridList()
End Sub

ボタンをクリックすると、datagridview の学校名の長さが取得され、列ヘッダーは「長さ」になります。

結果

代わりに、この非常によく似たコードを button_click で実行すると、学校名が即時ウィンドウに正しく表示されます。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim db As New DataClasses1DataContext()
    Dim TestQuery =
    From Block In db.BLOCK_ASSIGNMENTs
        Where Block.gr912_school = "Franklin"
    Select Block.gr6_school Distinct
    For Each block In TestQuery
        Debug.Print(block)
    Next

End Sub
4

3 に答える 3

2

これを試してください:

Public Function DataGridList() As BindingSource
    Dim NewBindingSource As New BindingSource()
    Dim db As New DataClasses1DataContext()
    NewBindingSource.DataSource = _
    From Block In db.BLOCK_ASSIGNMENTs
        Where Block.gr912_school = "Franklin"
    Select New With { Key .Value = Block.gr6_school } Distinct
    Return NewBindingSource
End Function

これにより、DataGridView が取得できるプロパティが提供されます。... は、ValueというNew With名前のプロパティを持つ匿名オブジェクトを作成します。DataGridView は、パブリック プロパティを列挙し、それらを列としてレンダリングすることにより、このタイプのオブジェクトで機能します。複数の値が必要な場合は、カンマで区切って同じ方法で中括弧内に項目を追加できます。詳細については、「匿名型 (Visual Basic)」を参照してください。

于 2012-08-02T18:01:14.850 に答える
0

Selectに.ToStringを追加してみてください。

   From Block In db.BLOCK_ASSIGNMENTs
        Where Block.gr912_school = "Franklin"
   Select Block.gr6_school.ToString Distinct

Debug.Printは、イミディエイトウィンドウに出力するときに、暗黙的に.ToStringに変換すると思います。ただし、データグリッドセルはすべてをオブジェクトとして扱い、そのオブジェクトのデフォルトのプロパティを表示します。

于 2012-08-02T14:05:23.597 に答える
0

もちろん、これはSOhereなどで頻繁に取り上げられてきました。私が選択したルートは、中間の DataTable を使用することでした。

Public Function DataGridList() As DataTable
    Dim NewDataTable As New DataTable
    Dim db As New DataClasses1DataContext()
    Dim i As Int32

    Dim qry =
    From Block In db.BLOCK_ASSIGNMENTs.AsEnumerable
        Where Block.gr912_school = "Franklin"
    Select Block.gr6_school Distinct

    NewDataTable.Columns.Add("School")
    For i = 0 To qry.Count - 1
        NewDataTable.Rows.Add(qry(i))
    Next
    Return NewDataTable
End Function

これは初めて実行するときはかなり遅いように見えるので、将来別のことを試すかもしれませんが、LINQ を介してグリッドにフィードすることができます。これは私が使いたいものです。

(qry の CopyToDataTable プロパティを使用したいのですが、クエリが DataTableRows コレクションなどを返す場合にのみ使用でき、私のハッキングではその方法が明らかになりませんでした。)

于 2012-08-02T17:38:37.767 に答える