我有一个带有 DataGridView 的项目,它显示来自平面文件数据库的数据。有 7 个按钮可将 SQL 查询结果加载到 DGV,并添加一个复选框以选择行。
当用户选择一个复选框时,该特定 DataGridViewRow (DGVR) 将被添加到临时 List(Of DGVR) 以供以后使用。
然后有一个显示第二个表单的最终按钮,对选定的两个条目进行比较,将临时列表传递给第二个表单。
用户将能够从 2 个不同的选项中选择 1 个(因此有单独的列表)。
问题是,如果您单击按钮 1 并选择一行,当您单击第二个按钮时,将数据源重置为新查询结果的行显然会将所有现有 DGVR 转换为空指针。
IE:对 DGVR 的引用丢失。
如果您从第一个按钮中选择一个,然后从第二个按钮中选择一个,然后尝试传递两个选定的项目,第一个将为空,但第二个不会。
代码:
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
我尝试克隆该行,以创建一个单独的副本,但这不起作用。如何将它与数据源分开,以便我可以加载一组新数据,但保存选定的行?