我在一个页面上绑定了一个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是不一样的。请问如何解决?

解决方案 »

  1.   

    Session("Num") = e.Item.DataSetIndex
      

  2.   

    不要通过e.Item.ItemIndex来取得要删除的行,用唯一标识这一行的字段来取得删除的行
      

  3.   

    Session("num") = DataKeys(e.Item.ItemIndex)
      

  4.   

    先在前台.aspx设置datagridDataKeyField="id"  设置这个唯一标识,然后是用Dim intid As Integer = DataGrid1.DataKeys(e.Item.ItemIndex)这样来获得的ID就是你真实对应纪录他实际SQL的ID了,这样就可以了
      

  5.   

    是的,用e.Item.ItemIndex来删除记录是不好用的,因为e.Item.ItemIndex相当于是页面显示的记录序号,而不是数据库当中对应的记录号,如果你一定要这样用,我只能说这样的编程思想是不好的。
      

  6.   

    不行呀,各位大侠,我不仅要对dataset删除,也要修改和添加,上面的方法好像不行呀,各位再帮帮忙?
      

  7.   

    你需要在刪除mytable.Rows(num).Delete()之後加一句:
    mytable.AcceptChanges()
      

  8.   

    刪除有3種方法:
    1.datatable.rows(第幾筆).delete()
      datatable.AcceptChanges()
    2.datatable.rows.removeat(第幾筆)
    3.datatable.rows.remove(刪除的ROW)
      

  9.   

    另外,如果是我自己寫的話,
    對於同一頁面的頁變數我較常用viewstate
    Session("Num")會改為viewstate("Num")
    Session("a")會改為viewstate("a")
    而對於跨頁面的變數我會選擇用session
    因為Session比較耗記憶體
      

  10.   

    你在刪除之後
    Datagrid1.DataSource = ds.Tables(0).DefaultView
    由於改變的是一個新的TABLE,其實DS.TABLES(0)還沒有改變
    所以我覺得改為
    Datagrid1.DataSource = mytable
    試試吧
      

  11.   

    to:Eddie005 : "Session("Num") = e.Item.DataSetIndex" ,看起来很有道理,但根本不行,它的效果与Session("Num") = e.Item.ItemIndex,是一样的谢谢daisylh,你的最后一个方法还是不行
    datatable中rowstate为deleted的行是没有index的,虽然它仍然占据一行。也就是说mytable.Rows.Count是不变的,请大家在想想
      

  12.   

    问题我解决了,在Delete_Click事件加上:
     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()
    不知各位看动了没有?再次感谢大家的帮助,谢谢