1

我正在为数据表中的每条记录添加一个选项卡页和 datagridview 到选项卡控件。

我想为每条记录创建一个新的 Tab/DataGridView(现在大约有 3 个)。我在声明一个新的DataGridView D。我以后如何引用这些控件?

我会想做一些事情,比如将datagridview中的更改保存到数据库中。目前我可以在屏幕上获取数据并且看起来不错,但我相信我没有正确添加 DataGridView 控件,因为我一直在重新使用“D”作为控件。

            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 类型,因此可以在 case 样式的逻辑语句(Visual Basic 中的 Select 语句、Visual C# 和 Visual C++ 中的 switch 语句)中对其进行计算。

于 2012-09-21T21:11:01.607 回答
0

我找到了解决问题的方法。问题是新行有一个自动编号 ID。

当 da.update(dt) 发生时,新行被插入到数据库中。数据库知道新的自动编号 ID。但是,数据表没有。

为了让数据表知道,数据适配器被重新填充。但是,这会导致数据表包含所有旧行以及所有新行,并且它们都出现在 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 回答