Datareader 到 Datasource OK,但 Datagridview 只显示 1 行

Datareader to Datasource OK, but Datagridview displaying only 1 row

我有一个 datagridview(带有绑定源,来自 master 的详细信息),它是从 datareader 以编程方式填充的。 Datareader 成功检索所有数据并将新行添加到绑定源。但是,datagridview 只显示一行。所以在 datagridview 中它显示的是来自 datareader 的最后一行。

当我从(主控的)bindingnavigator 中单击 Previous 按钮,然后单击 Next 时,所有行都显示在 datagridview 中,就好像它正在刷新绑定源并将每行绑定到每个 datagridview 行一样。我知道我在这里遗漏了一些东西,但不确定是什么。

Private Sub PopulateDetails(ByVal orderno As String)
    Dim cmd As New SqlClient.SqlCommand
    Dim dr As SqlClient.SqlDataReader

    LoadDB()

    If Not con.State = ConnectionState.Open Then
        con.Open()
    End If

    cmd.CommandText = "select orderid, pono, cono, styleno, fabriccodeid, custfabriccode, colorid, orderqty, totalbales, uomid, width, " &
                      "weightperarea, yard, gramperyard, size, unitprice, currencycode, deliverydt, remark from tblorderdetails " &
                      "where orderno = @orderno;"
    cmd.Connection = con
    cmd.Prepare()
    cmd.Parameters.AddWithValue("@orderno", orderno)
    dr = cmd.ExecuteReader

    With dr
        If .HasRows() Then
            Dim newRow As DataRowView

            While .Read
                newRow = DirectCast(TblorderdetailsBindingSource.AddNew(), DataRowView)
                newRow.BeginEdit()
                newRow.Row.BeginEdit()

                newRow.Row("orderno") = OrdernoTextBox.Text
                newRow.Row("pono") = .Item("pono")
                newRow.Row("cono") = .Item("cono")
                newRow.Row("styleno") = .Item("styleno")
                newRow.Row("fabriccodeid") = .Item("fabriccodeid")
                newRow.Row("custfabriccode") = .Item("custfabriccode")
                ''newRow("btncolor") = .Item("colorid")
                newRow.Row("orderqty") = .Item("orderqty")
                newRow.Row("totalbales") = .Item("totalbales")
                newRow.Row("uomid") = .Item("uomid")
                newRow.Row("width") = .Item("width")
                newRow.Row("weightperarea") = .Item("weightperarea")
                newRow.Row("yard") = .Item("yard")
                newRow.Row("gramperyard") = .Item("gramperyard")
                newRow.Row("size") = .Item("size")
                newRow.Row("unitprice") = .Item("unitprice")
                newRow.Row("currencycode") = .Item("currencycode")
                newRow.Row("deliverydt") = .Item("deliverydt")
                newRow.Row("remark") = .Item("remark")

                newRow.Row.EndEdit()
                newRow.DataView.Table.Rows.Add(newRow.Row)

            End While
        End If
        .Close()

    End With
    con.Close()

End Sub

这是非常错误的错误方法。调用ExecuteReader后,只需调用DataTableLoad方法,并传递数据reader。这将添加所有行甚至列(如果它们还不存在的话)。或者,使用数据适配器并调用其 Fill 方法,将 DataTable 作为参数传递。同样的结果。

我已经工作了 4 天寻找在 datagridview 中显示所有行的方法,并最终通过这个解决它:

TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()

显然,绑定源需要由绑定导航器以某种方式刷新,然后它才显示 datagridview 中所有添加的行(自动生成的列 ID 为 -1、-2、-3...)。用户可以修改这些行然后保存。

很遗憾,这似乎不是 "intelligent" 解决方法,但很高兴它能以某种方式起作用。