0

フラット ファイル データベースのデータを表示する 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

行を複製して別のコピーを作成しようとしましたが、うまくいきません。新しいデータセットをロードできるようにデータソースから分離するにはどうすればよいですか?ただし、選択した行を保存しますか?

4

1 に答える 1

1

DataGridViewは、 DataSourceが変更されるたびにすべての行を削除します。基になるデータを常に参照する必要があります。DataTableがグリッドにバインドされる方法を理解する時が来たと思います。

新しいデータ ソースを設定すると、グリッドは、新しいオブジェクトのタイプがIListSourceインターフェイスを実装しているかどうかを確認します。DataTableは、このインターフェイスを実装します。これはDefaultViewを返し、グリッドがソースとして使用するのは実際にはこのインスタンスです。グリッドは新しい行を作成し、各行はDataRowViewにバインドされます(これはさらにDataRowにバインドされます)。

DataGridView > DataView > DataTable

DataGridViewRow > DataRowView > DataRow

DataGridViewRowDataBoundItemプロパティを使用して、 DataRowViewへの参照を取得できます。

Dim gridRow As DataGridViewRow = Me.DataGridView1.Rows(0)
Dim viewRow As DataRowView = DirectCast(gridRow.DataBoundItem, DataRowView)
Dim tableRow As DataRow = viewRow.Row

データ テーブルをコピーする代わりに、新しいデータ ビューを作成します。

Dim view1 As New DataView(mytable)
Dim view2 As New DataView(mytable)

データ ビューの並べ替えとフィルター処理を行うことができます。

view1.Sort = "Name ASC"
view1.RowFilter = "Name = 'Smith' And Age >= 18"

これで、この DataViewを既定のビューの代わりにデータ ソースとして使用できます。

Me.DataGridView1.DataSource = view1
于 2014-08-31T08:59:19.220 に答える