703
汽車大全
datagrid與DataSet結合使用中出現的索引問題
當把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)
最後更新:2017-04-02 00:06:36