Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Datareader到Datasource正常,但Datagridview仅显示1行_Sql Server_Vb.net_Winforms_Datagridview_Datareader - Fatal编程技术网

Sql server Datareader到Datasource正常,但Datagridview仅显示1行

Sql server Datareader到Datasource正常,但Datagridview仅显示1行,sql-server,vb.net,winforms,datagridview,datareader,Sql Server,Vb.net,Winforms,Datagridview,Datareader,我有一个datagridview(带有bindingsource,来自master的详细信息),它是从datareader以编程方式填充的。Datareader成功检索所有数据并向bindingsource添加新行。但是,datagridview仅显示一行。因此,在datagridview中,它显示了datareader的最后一行 当我从bindingnavigator(主机的)中单击Previous按钮时,接下来,datagridview中将显示所有行,就好像它正在刷新bindingsourc

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

当我从bindingnavigator(主机的)中单击Previous按钮时,接下来,datagridview中将显示所有行,就好像它正在刷新bindingsource并将每一行绑定到每个datagridview行一样。我知道我遗漏了什么,但不确定是什么

Private子填充详细信息(ByVal orderno作为字符串)
Dim cmd作为新的SqlClient.SqlCommand
将灾难恢复设置为SqlClient.SqlDataReader
LoadDB()
如果不是con.State=ConnectionState.Open,则
con.Open()
如果结束
cmd.CommandText=“选择订单ID、pono、cono、styleno、fabriccodeid、custfabriccode、COLORIID、订单数量、总捆数、uomid、宽度,”&
“重量地区、码、码、码、尺寸、单价、货币代码、交货日期、来自tblorderdetails的备注”&
“其中orderno=@orderno;”
cmd.Connection=con
cmd.Prepare()
cmd.Parameters.AddWithValue(“@orderno”,orderno)
dr=cmd.ExecuteReader
与dr
如果.HasRows()那么
将新行变暗为DataRowView
边读边读
newRow=DirectCast(TblorderdetailsBindingSource.AddNew(),DataRowView)
newRow.BeginEdit()
newRow.Row.BeginEdit()
newRow.Row(“orderno”)=OrdernoTextBox.Text
newRow.Row(“pono”)=.Item(“pono”)
newRow.Row(“cono”)=项目(“cono”)
newRow.Row(“样式号”)=.Item(“样式号”)
newRow.Row(“fabriccodeid”)=.Item(“fabriccodeid”)
newRow.Row(“custfabriccode”)=.Item(“custfabriccode”)
“newRow(“btncolor”)=.Item(“colorid”)
newRow.Row(“订单数量”)=项目(“订单数量”)
newRow.Row(“totalbales”)=项目(“totalbales”)
newRow.Row(“uomid”)=.Item(“uomid”)
newRow.Row(“宽度”)=.Item(“宽度”)
newRow.Row(“weightperarea”)=项目(“weightperarea”)
新行(“码”)=项目(“码”)
newRow.Row(“gramperyard”)=.Item(“gramperyard”)
newRow.Row(“大小”)=.Item(“大小”)
newRow.Row(“单价”)=.Item(“单价”)
newRow.Row(“currencycode”)=.Item(“currencycode”)
newRow.Row(“deliverydt”)=项目(“deliverydt”)
newRow.Row(“备注”)=.Item(“备注”)
newRow.Row.EndEdit()
newRow.DataView.Table.Rows.Add(newRow.Row)
结束时
如果结束
.Close()
以
con.Close()
端接头

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

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

TblorderBindingSource.MovePrevious()
TblorderBindingSource.MoveNext()
显然,bindingnavigator需要以某种方式刷新bindingsource,然后只显示datagridview中添加的所有行(自动生成的列id为-1、-2、-3…)。用户可以修改这些行,然后保存


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

“非常错误的方式”?怎么可能呢?如果是这样,它就不会出现在API中了?如果在添加到DataTable之前需要处理每条记录并修改/计算一些值,该怎么办?Read()到底有什么问题?@jmcilhinney没有数据表,只有bindingsource。如果bindingsource被强制转换为datatable:
Dim bs=Me.TblorderdetailsBindingSource Dim dt=CType(bs.DataSource,datatable)
它会出错
无法将“System.Windows.Forms.bindingsource”类型的对象强制转换为“System.Data.datatable”。
当然有一个
datatable
。您认为
newRow.DataView.Table
是什么?根据该错误消息,听起来好像您已将一个
BindingSource
绑定到另一个
BindingSource
。这可能表明您有父/子数据。无论如何,在它的底部某处有一个
DataTable