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
后,只需调用DataTable
的Load
方法,并传递数据reader。这将添加所有行甚至列(如果它们还不存在的话)。或者,使用数据适配器并调用其 Fill
方法,将 DataTable
作为参数传递。同样的结果。
我已经工作了 4 天寻找在 datagridview 中显示所有行的方法,并最终通过这个解决它:
TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()
显然,绑定源需要由绑定导航器以某种方式刷新,然后它才显示 datagridview 中所有添加的行(自动生成的列 ID 为 -1、-2、-3...)。用户可以修改这些行然后保存。
很遗憾,这似乎不是 "intelligent" 解决方法,但很高兴它能以某种方式起作用。
我有一个 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
后,只需调用DataTable
的Load
方法,并传递数据reader。这将添加所有行甚至列(如果它们还不存在的话)。或者,使用数据适配器并调用其 Fill
方法,将 DataTable
作为参数传递。同样的结果。
我已经工作了 4 天寻找在 datagridview 中显示所有行的方法,并最终通过这个解决它:
TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()
显然,绑定源需要由绑定导航器以某种方式刷新,然后它才显示 datagridview 中所有添加的行(自动生成的列 ID 为 -1、-2、-3...)。用户可以修改这些行然后保存。
很遗憾,这似乎不是 "intelligent" 解决方法,但很高兴它能以某种方式起作用。