我在一个页面上绑定了一个datagrid,它的数据源为一dataset中的一个数据表(从数据库中读出来的),同时还有按钮列(对应OnItemCommand事件),此外还有还有一按钮,对应Delete_Click事件:
Public Sub datagrid1_OnItemCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs) Handles Datagrid1.ItemCommand
‘页面间传递参数,让下面的Delete_Click事件知道要删除那一行数据
Session("Num") = e.Item.ItemIndex
End Sub按钮Delete_Click事件
Private Sub Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Delete.Click
‘确定要删除的是哪一行
Dim num As Integer
num = Session("Num")
‘ds是从pageload李传递过来的,没问题
Dim ds As DataSet
Dim mytable As DataTable
ds = New DataSet
ds = CType(Session("a"), DataSet)
mytable = New DataTable
mytable = ds.Tables(0)
Response.Write(mytable.Rows.Count)‘删除被选定的行
mytable.Rows(num).Delete()
’重新绑定
Datagrid1.DataSource = ds.Tables(0).DefaultView
Datagrid1.DataBind
End Sub还有一事件是将ds更新到数据库里,没写出来,绝对没问题。问题是:如果删除一行数据,没问题。如果删除多行数据,必须从后往前删,从前向后删,则不行。
因为在datagrid中是不将rowstate为deleted的行绑定的,但在datatable中rowstate为deleted的行仍然占据一行,所以对他们来说,行的index是不一样的。请问如何解决?
Public Sub datagrid1_OnItemCommand(ByVal sender As System.Object, ByVal e As DataGridCommandEventArgs) Handles Datagrid1.ItemCommand
‘页面间传递参数,让下面的Delete_Click事件知道要删除那一行数据
Session("Num") = e.Item.ItemIndex
End Sub按钮Delete_Click事件
Private Sub Delete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Delete.Click
‘确定要删除的是哪一行
Dim num As Integer
num = Session("Num")
‘ds是从pageload李传递过来的,没问题
Dim ds As DataSet
Dim mytable As DataTable
ds = New DataSet
ds = CType(Session("a"), DataSet)
mytable = New DataTable
mytable = ds.Tables(0)
Response.Write(mytable.Rows.Count)‘删除被选定的行
mytable.Rows(num).Delete()
’重新绑定
Datagrid1.DataSource = ds.Tables(0).DefaultView
Datagrid1.DataBind
End Sub还有一事件是将ds更新到数据库里,没写出来,绝对没问题。问题是:如果删除一行数据,没问题。如果删除多行数据,必须从后往前删,从前向后删,则不行。
因为在datagrid中是不将rowstate为deleted的行绑定的,但在datatable中rowstate为deleted的行仍然占据一行,所以对他们来说,行的index是不一样的。请问如何解决?
mytable.AcceptChanges()
1.datatable.rows(第幾筆).delete()
datatable.AcceptChanges()
2.datatable.rows.removeat(第幾筆)
3.datatable.rows.remove(刪除的ROW)
對於同一頁面的頁變數我較常用viewstate
Session("Num")會改為viewstate("Num")
Session("a")會改為viewstate("a")
而對於跨頁面的變數我會選擇用session
因為Session比較耗記憶體
Datagrid1.DataSource = ds.Tables(0).DefaultView
由於改變的是一個新的TABLE,其實DS.TABLES(0)還沒有改變
所以我覺得改為
Datagrid1.DataSource = mytable
試試吧
datatable中rowstate为deleted的行是没有index的,虽然它仍然占据一行。也就是说mytable.Rows.Count是不变的,请大家在想想
For i = 0 To mytable.Rows.Count
If mytable.Rows(i).RowState.Equals(DataRowState.Deleted) Then
k = k + 1
ElseIf mytable.Rows(i)(0) = ProID.Text Then
Exit For
End If
Next mytable.Rows(num + k).Delete()
不知各位看动了没有?再次感谢大家的帮助,谢谢