我用的是模板列,里面放Checkbox控件,后台程序用循环判断来删除所选择的数据行,一般来说传递的参数是DataKeyField里的字段,而我的表是双主键,如何删除?代码如下:前台代码:
<asp:datagrid id="DataGrid1" runat="server" DataKeyField="fClientN".....>
<Columns><asp:TemplateColumn HeaderText="删除勾选">
<ItemTemplate>
<asp:CheckBox id="DeleteorNot" Checked="False" runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="购买">
<ItemTemplate>
<asp:HyperLink id=HyperLink1 runat="server" Target=_blank    Text='<%# DataBinder.Eval(Container, "DataItem.fClientN")%>'  NavigateUrl='<%# "TrainRecordPreview.aspx?ClientN=" &  DataBinder.Eval(Container, "DataItem.fClientN") & "&TrainDate=" & DataBinder.Eval(Container, "DataItem.fTrainDate")%>'/> 
</ItemTemplate>
</asp:TemplateColumn> <asp:BoundColumn DataField="fTrainDate" HeaderText="授课日期" DataFormatString="{0:d}">
</asp:BoundColumn>
...........
略了其他绑定列
..........
</Columns>
</asp:datagrid>
后台:
..........
cmd.Parameters.Add("@ClientN", SqlDbType.Char, 60)
cmd.Parameters.Add("@TrainDate", SqlDbType.SmallDateTime)
我用的是存储过程,传递如上两个参数
........
  For Each CheckBoxItem In DataGrid1.Items                 If CType(CheckBoxItem.FindControl("DeleteorNot"), CheckBox).Checked Then         cmd.Parameters("@ClientN").Value = DataGrid1.DataKeys(CheckBoxItem.ItemIndex)
         这两个参数所涉及的字段都在绑定列中,上面一个为datakeyfield的字段内容,不必多说,
         如果改表是单主键,用它就可以了,而我的表是双主键,必须再传递下面一个参数,数据库 才能知道删除哪个?怎么给它赋值?
         cmd.Parameters("@TrainDate").Value = ?????????
            con.Open()             Try
                cmd.ExecuteNonQuery() 
                   message.Text = "记录成功删除"  
             Catch exc As SqlException
                    message.Text = "错误:记录没有成功删除"
             End Try              con.Close()
     End If
    Next这是我第一次发帖子,分不多,各位照顾一下,拜托

解决方案 »

  1.   

    用datagrid作一个隐藏列,取隐藏列的值
      

  2.   

    http://community.csdn.net/Expert/topic/3827/3827683.xml?temp=.345318
      

  3.   

    private void FindInMultiPKey(DataTable myTable){
        DataRow foundRow;
        // Create an array for the key values to find.
        object[]findTheseVals = new object[3];
        // Set the values of the keys to find.
        findTheseVals[0] = "John";
        findTheseVals[1] = "Smith";
        findTheseVals[2] = "5 Main St.";
        foundRow = myTable.Rows.Find(findTheseVals);
        // Display column 1 of the found row.
        if(foundRow != null)
          Console.WriteLine(foundRow[1]);
     }
    注意多个主键组合后,确定其必须唯一.......
      

  4.   

    先取出授課日期:
    dim cdate as string
    cdate=ctype(e.item.cells(授課日期所在datagrid是第幾列,從0開始).controls(0),textbox).text
    然後再將其轉換為日期的格式
    cmd.Parameters("@TrainDate").Value =Convert.ToDateTime(mid(cdate,5,2) & "/" & right(cdate,2) & "/" & left(cdate,4))
      

  5.   

    to:daishlh
    我是用vb写的,e.item.出错,请问怎么回事呀?
      

  6.   

    DataGrid里面的主键,跟数据库里面的主键不是一个意思,只要你能保证此数据的唯一,那么datagrid就认可。所以,我们可以在SQL语句中构建唯一主键。
    象楼主这样的问题,可以把表里面的两个主键,组成成一个主键,比如
    sql = "select columa||','||columb from table";
    两个主键组合在一起,肯定能够实现唯一。那么在取值的时候,如平常一样取,只是判断的时候这样判断
    sql = "update table set xxx=xxx where columa||','||columb = '" + 取到的值 + "'"
      

  7.   

    同意 evaELLIS() 
       我以前也这么搞的,多绑定一个列,设为隐藏列(如果不想这个列显示在页面上的话)
       你就可以把
       cmd.Parameters("@TrainDate").Value =那个列的值了
      

  8.   

    嗨~剛看到
    我也是用VB.NET寫的,你是不是寫在OnDeleteCommand事件中?如果是就會找到e.item
      

  9.   

    用dataset  的datarow对象有个findby方法也可以