フラット ファイル データベースのデータを表示する DataGridView を含むプロジェクトがあります。SQL クエリの結果を DGV にロードする 7 つのボタンと、行を選択するためのチェックボックスが追加されています。
ユーザーがチェックボックスを選択すると、その特定の DataGridViewRow (DGVR) が後で使用するために一時的な List(Of DGVR) に追加されます。
次に、2 番目のフォームを表示する最後のボタンがあり、選択した 2 つのエントリを比較して、一時リストを 2 番目のフォームに渡します。
ユーザーは、2 つの異なる選択肢から 1 つを選択できます (したがって、個別のリスト)。
問題は、ボタン 1 をクリックして行を選択し、2 番目のボタンをクリックすると、データソースを新しいクエリ結果にリセットする行によって、既存のすべての DGVR が明らかに null ポインターに変わることです。
IE: DGVR への参照が失われます。
最初のボタンから 1 つを選択し、次に 2 番目のボタンから 1 つを選択してから、選択した 2 つの項目を渡そうとすると、最初の項目は null になりますが、2 番目の項目は null になりません。
コード:
Dim con As New OleDb.OleDbConnection
Dim dbProvider As String
Dim dbSource As String
currentWeapon = "Sniper"
Dim ds As New DataSet
Dim da As New OleDb.OleDbDataAdapter
Dim sql As String
dbProvider = "PROVIDER=Microsoft.ACE.OLEDB.12.0;"
dbSource = "Data Source = Resources/Battlefield 4 Weapons.accdb"
con.ConnectionString = dbProvider & dbSource
con.Open()
sql = "SELECT * FROM [Battlefield 4 Weapons]"
da = New OleDb.OleDbDataAdapter(sql, con)
da.Fill(ds, "Battlefield 4 Weapons.accdb")
con.Close()
Dim dt As DataTable = ds.Tables(0)
Dim dr As DataRow() = dt.Select("[Weapon type] = 'Sniper'", "Weapon Name")
Dim miniDT As New DataTable
miniDT = dr.CopyToDataTable()
DataGridView1.DataSource = miniDT
DataGridView1.Sort(DataGridView1.Columns("Weapon Name"), System.ComponentModel.ListSortDirection.Ascending)
DataGridView1.MultiSelect = True
新しいボタンが押されたときにエントリを無効にする行は次の行です。
DataGridView1.DataSource = miniDT
次に、チェックボックスがクリックされると、このコードが実行されます (武器の種類ごとにケースがあります)。AsList は、行を渡す前に一時的に行を保持するように設計されたリストです。
DataGridView1.EndEdit()
Select Case currentWeapon
Case "Assault"
Assaultlabel.Visible = True
AsList.RemoveRange(0, AsList.Count)
For i = 0 To DataGridView1.Rows.Count - 1
If DataGridView1.Rows(i).Cells(14).Value = True Then
If Not AsList.Contains(DataGridView1.Rows(i)) Then
AsList.Add(DataGridView1.Rows(i))
End If
End If
Next
行を複製して別のコピーを作成しようとしましたが、うまくいきません。新しいデータセットをロードできるようにデータソースから分離するにはどうすればよいですか?ただし、選択した行を保存しますか?