まず、問題の原因である場合とそうでない場合がありますが、次の行です。
DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
タイプミスが含まれています。DataGridView1.DataSource である必要があります。ただし、これによりコンパイラエラーが発生したようです。
それ以外は、以下のような単純化を試みてください。まだバインドの問題がある場合は、デバッガーでステップスルーして、すべてが期待どおりに機能していることを確認してください。また、dgv コントロールの「列の自動生成」プロパティが true に設定されていることを確認してください。
あなたがやろうとしていることのいくつかについては明確ではないので、以下は私がこれにどのようにアプローチするかの非常に一般的な例です.
- まず、接続文字列をプロジェクト設定ファイルに移動し、My.Settings.MyConnectionStringName を使用して参照します。
- 次に、インライン連結ではなく、SQL でパラメーターを使用します。
- 「Using」ブロックでデータ アクセスをラップします。を使用すると、ブロック スコープ内のオブジェクトの破棄が処理され、一般にクリーンな方法になります。
- 私の個人的な好みですが、単純なデータテーブルが行うデータセットに伴うすべての bs オーバーヘッドは好きではありません。
- ここではできる限り完全には実行しませんでしたが、データの取得を UI コントロールへの割り当てから分離することをお勧めします。さらに、おそらく次のステップに進み、コントロールの割り当てを Form Load イベントからも分離します。フォーム内に、データソースの更新またはリセットが必要な場所が複数あることに気付くかもしれません。
これにアプローチするにはさまざまな方法があり、私の方法は必ずしも「一般的な方法」ではありません。ただし、次の方法でうまくいきました。
コードを簡素化し、いくつかのリファクタリングを採用します。
Imports System.Data
Imports System.Data.OleDb
Public Class TechScreen
Private Sub TechScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'Not sure where your TechScreenID input parameter is coming from, so this is just for example:
Dim TechID As Integer = 1
' Use a function to return the data to be used as the DataSource for the dgv control:
DataGridView1.DataSource = Me.JobListTable(TechID)
End Sub
Private Function JobListTable(TechID As Integer) As DataTable
Dim dt As DataTable = Nothing
Dim SQL As String = "SELECT * FROM joblist WHERE techID = @TechID"
' The Using block handles disposal of objects initialized:
Using con As OleDbConnection = New OleDbConnection(My.Settings.MyConnection)
Using cmd As OleDbCommand = New OleDbCommand(SQL, con)
' Use parameters instead of inline concatenation for cleaner code,
' and protection against sql injection attacks:
cmd.Parameters.AddWithValue("@TechID", TechID)
con.Open()
dt = New DataTable()
Try
dt.Load(cmd.ExecuteReader())
Catch
MsgBox("There was an error retrieving data")
Finally
con.Close()
End Try
End Using
End Using
Return dt
End Function
End Class