1

データテーブル内のすべてのレコードのタブコントロールにタブページとdatagridviewを追加しています。

レコードごとに新しいTab/DataGridViewが必要です(現時点では最大3つあります)。新しいDataGridViewDを宣言しています。後でこれらのコントロールを参照するにはどうすればよいですか?

datagridviewの変更をデータベースに保存するようなことをしたいと思います。現在、画面上でデータを取得でき、見栄えは良いですが、「D」をコントロールとして再利用し続けているため、DataGridViewコントロールを正しく追加していないと思います。

            Dim dt As New DataTable

        GetDataTable("SELECT * FROM aFeeTypes DescSeq", dt)

        Dim i As Integer

        'for each class in the datatable add a tab and a datagridview
        For i = 0 To dt.Rows.Count - 1

            Dim dr As DataRow
            dr = dt.Rows(i)

            Dim D = New DataGridView
            D.Visible = True

            Dim tp As New TabPage
            tp.Name = "tp" & i
            tp.Text = dr.Item("Desc2")
            frmUI.tcFee.TabPages.Add(tp)
            frmUI.tcFee.TabPages(i).Controls.Add(D)

            dgv_Fill(D, "SELECT * FROM Fee WHERE ClassID=" & dr.Item("ClassID") & " ORDER BY Seq")

            D.AutoResizeColumns()
            D.Width = tp.Width
            D.Height = tp.Height

        Next i

これは動作しません:

            With frmUI.Controls("D" & i)
                .AutoResizeColumns()
                .Width = tp.Width
                .Height = tp.Height
            End With
4

2 に答える 2

1

Dで使用しているスコープ内の純粋な変数名です。

コントロールに、後で参照できる一意の名前を付ける必要があります。

Nameプロパティは、実行時に、タイプやプログラム名ではなく、名前でオブジェクトを評価するために使用できます。NameプロパティはString型を返すため、ケーススタイルのロジックステートメント(Visual BasicではSelectステートメント、Visual C#およびVisual C ++ではswitchステートメント)で評価できます。

于 2012-09-21T21:11:01.607 に答える
0

私はその問題の解決策を見つけました。問題は、新しい行に自動番号IDがあることです。

da.update(dt)が発生すると、新しい行がデータベースに挿入されます。データベースは新しい自動番号IDを認識しています。ただし、データテーブルはそうではありません。

datatableが知るために、dataadapterが補充されます。ただし、これにより、データテーブルにはすべての古い行とすべての新しい行が含まれ、それらはすべてdatagridviewに表示されます。

データテーブルから古い行をクリアすることにより、塗りつぶしはデータテーブル内のすべてのデータを更新し、したがってデータグリッドビューを更新します。

    Public Sub dgv_AddRow(ByVal dgvName As String)

    Dim dgv As DataGridView = colDataGridView.Item(dgvName)

    Dim da As SqlDataAdapter = colDataAdapter.Item(dgvName)
    Dim dr As DataRow = frmUI.allDataSet.Tables(dgvName).NewRow

    'autopopulate the class id
    dr("ClassID") = dgv.Parent.Tag

    'add the new row
    frmUI.allDataSet.Tables(dgvName).Rows.Add(dr)

    'get the changed table
    Dim dt As DataTable = frmUI.allDataSet.Tables(dgvName)

    'inserts the new row to the database.  concurrency violation 
    'will occur because datatable does not know the new Autonumber ID for the new row.

    da.Update(dt)

    'remove the datatable rows so they can be replaced using the adapter fill
    'if rows are not cleared, following fill causes datatable to 
    'have existing rows plus all the rows again due to the fill

    frmUI.allDataSet.Tables(dgvName).Rows.Clear()

    'refill the adapter (refill the table)
    'Everything you do to the underlying dataTable
    'gets displayed instantly on the datagridview

    da.Fill(frmUI.allDataSet, dgvName)



End Sub
于 2012-09-25T16:16:59.837 に答える