Datareader to Datasource OK,但Datagridview仅显示1行

问题描述 投票:0回答:2

我有一个datagridview(带有bindingsource,是master的一个细节),它是通过datareader编程填充的。 Datareader成功检索所有数据并将新行添加到bindingsource。但是,datagridview仅显示一行。因此,在datagridview中,它显示了数据读取器的最后一行。

[当我从(主)的绑定导航器中单击上一个按钮时,然后是下一个,所有行都显示在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
sql-server vb.net winforms datagridview datareader
2个回答
0
投票

这完全是错误的错误方法。调用ExecuteReader之后,只需调用LoadDataTable方法并传递数据读取器。这将添加所有行,甚至是列(如果还没有的话)。或者,使用数据适配器并调用其Fill方法,并将DataTable作为参数传递。结果相同。


0
投票

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

TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()

显然,绑定源需要通过bindingnavigator刷新,然后只有它显示datagridview中所有添加的行(具有自动生成的列ID -1,-2,-3 ...)。用户可以修改这些行然后保存。

我很遗憾,这似乎不是一个“智能”解决方法,但很高兴它能以某种方式起作用。

© www.soinside.com 2019 - 2024. All rights reserved.