当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > datagrid与DataSet结合使用中出现的索引问题

ASP.NET
Visual Studio.Net 内幕(7)
.Net 2.0 原汁原味读取注册表
ASP.NET 2.0中预设的cookie
ASP.NET:一段比较经典的多线程学习代码
ASP.NET2.0服务器控件之自定义状态管理
Asp.net给站点某目录增加Aspnet用户
ASP.NET技巧:请求网址并解析返回的html
在Asp.net用C#建立动态Excel
ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意
ASP.NET技巧:数据岛出到Excel最为简易的方法
第一次用.net2.0 LOGIN登陆控件的困惑和解决方法
在ASP.net中保存/取出图片入/从SQL数据库
ASP.NET技巧:做个DataList可分页的数据源
在.NET中利用委托实现窗体间通信
在.NET2.0中使用自定义事务操作
解决 ASP.NET中目录访问权限的问题
ASP.Net防止刷新自动触发事件的解决方案
白刃之战:PHP vs. ASP.NET(节选)-架构比较
C#中使用SendMessage
提取HTML代码中文字的C#函数

ASP.NET 中的 datagrid与DataSet结合使用中出现的索引问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 139 ::
收藏到网摘: n/a

当把DataSet绑定到Datagrid控件,

并利用DataAdapter对象修改数据库

如:
dimadpasnewOleDbDataAdapter(stradp,conn)
dimocbasnewOleDbCommandBuilder(adp)
adp.DeleteCommand=ocb.GetDeleteCommand()
adp.Update(ds,"Orders")
--------------------------------

执行删除操作时,如我们加入这样一个方法:
submydatagrid_delete(senderasobject,easdatagridcommandeventargs)
dimdtasnewDataTable()
dt=ds.Tables("Orders")
dimdrasDataRow
dr=dt.Rows(E.Item.ItemIndex)
dr.delete
'dr.AcceptChanges'曾经尝试使用彻底删除,发现adp自动更新回数据库时,无法自动生成相应的sql语句

'解决删除当前页最后一项时出现的页索引异常
'*****************************************************************
dimlastEditPageasinteger=mydatagrid.currentPageIndex
If(mydatagrid.pageCount-mydatagrid.currentPageIndex)=1andmydatagrid.Items.Count=1Then
Ifmydatagrid.pageCount>1Then
lastEditPage=LastEditPage-1
Else
lastEditPage=0
EndIf

EndIf
mydatagrid.currentPageIndex=lastEditPage
'****************************************************************


session("orderList")=ds
mydatagrid.edititemindex=-1
mydatagrid.datasource=ds.tables("Orders")
mydatagrid.databind()
endsub

当由第一个开始逐个删除时出现了异常,发现在删除第二时,删不掉,即原来的dr(2)没有自动变为dr(1)。如果我们使用dr.deletedr.acceptChanges则可以自动变化,但是上面说明了,则无法使用自动更新回到数据库。我们必须获得删除时的实际索引,所以就用了一个本方法,在当前的ds中另外建了一个Table,保持同步删除,但是在Table的id列中,保存实际的索引值,具体代码如下:

解决dr索引的一个办法:

dimorderTableasnewDataTable()'建一个临时表用来保存索引,保持同步删除
dimtheNewRowasDataRow
dimdcasDataColumn

orderTable.TableName="orderId"
ds.Tables.add(orderTable)
dc=newDataColumn()
dc.ColumnName="id"
orderTable.columns.add(dc)

dimdcKey()asDataColumn={orderTable.Columns("id")}
orderTable.primaryKey=dcKey

dimiasinteger
Fori=0to(ds.Tables("Users").Rows.Count-1)
theNewRow=orderTable.NewRow()
theNewRow("id")=i.toString()
orderTable.Rows.add(theNewRow)
Next

上述删除功能中加的代码,替换dr=dt.Rows(e.Item.ItemIndex):

dimdrOrderasDataRow
drOrder=ds.Tables("orderId").Rows(E.Item.ItemIndex)
dimcurrentOrderasinteger=CInt(drOrder("id"))+mydatagrid.currentPageIndex*mydatagrid.PageSize
dr=dt.Rows(currentOrder)
drOrder.delete

如果有更新功能,则替换dr=dt.Rows(e.Item.ItemIndex):

dimdrOrderasDataRow
drOrder=ds.Tables("orderId").Rows(E.Item.ItemIndex)
dimcurrentOrderasinteger=CInt(drOrder("id"))+mydatagrid.currentPageIndex*mydatagrid.PageSize
dr=dt.Rows(currentOrder)