2015-07-02 211 views
0

尽管我试图理解gridview的删除方法,但我仍然无法确定如何删除一行。我使用相同的gridview来显示4个SQL表。根据选择哪个表,我进入swich case来更改SQLDataSource的SELECT和DELETE命令。我不确定这是否是最佳做法,但SELECT部分​​起作用。gridview删除问题。不能从gridview删除按钮中删除SQL记录

这是删除部分,我需要一些帮助。

  1. 我的思维过程对如何实现我的目标是否正确?
  2. 我必须有OnRowDeleting =“gv1_RowDeleting”否则它给了我一个 错误。这是强制性的吗?
  3. 这是什么与我的代码不起作用?

.ASPX:

<form id="form1" runat="server"> 
      <div class="listTitle"><% Response.Write(strListTitle); %> 
       <asp:GridView ID="gv1" 
        runat="server" 
        DataKeyNames="id" 
        CellPadding="2" 
        AutoGenerateDeleteButton="True" 
        OnRowDeleting="gv1_RowDeleting" 
        OnRowDeleted="gv1_deleteItem"> 
       </asp:GridView> 
      </div> 
     </form> 
    </div> <!-- close middle --> 
    <div id="footer"> 

     <asp:SqlDataSource ID="DS" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>"> 
      <DeleteParameters> <asp:Parameter Name="id"/> </DeleteParameters> 
     </asp:SqlDataSource> 

    </div> 

.CS文件:

switch (strType) 
    { 
     case "servers": 
      DS.SelectCommand = "SELECT * FROM tbServers"; 
      DS.DeleteCommand = "DELETE FROM tbServers WHERE id = @id"; 
      strListTitle = "Server List"; 
      break; 
     case "systems": 
      DS.SelectCommand = "SELECT * FROM tbSystems"; 
      DS.DeleteCommand = "DELETE FROM tbSystems WHERE id = @id"; 
      strListTitle = "System List"; 
      break; 
     case "itOwners": 
      DS.SelectCommand = "SELECT * FROM tbITowners"; 
      DS.DeleteCommand = "DELETE FROM tbITowners WHERE id = @id"; 
      strListTitle = "IT Owner List"; 
      break; 
     case "systemOwners": 
      DS.SelectCommand = "SELECT tbSystemOwners.id, tbITowners.owner, tbSystems.Systems FROM tbITowners INNER JOIN tbSystemOwners ON tbITowners.id = tbSystemOwners.idITowners INNER JOIN tbSystems ON tbSystemOwners.idSytems = tbSystems.id"; 
      DS.DeleteCommand = "DELETE FROM tbSystemOwners WHERE id = @id"; 
      strListTitle = "System Owner List"; 
      break; 
     default: 
      break; 
    } 
    gv1.DataSource = DS; 
    gv1.DataBind(); 
} 

protected void gv1_deleteItem(object sender, GridViewDeletedEventArgs e) 
{ 
    // Display whether the delete operation succeeded. 
    if (e.Exception == null) 
    { 
     Response.Write("Row deleted successfully."); 
    } 
    else 
    { 
     Response.Write("An error occurred while attempting to delete the row."); 
     e.ExceptionHandled = true; 
    } 
} 

protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 

} 
+0

#2是................. –

回答

1

重:#3 我认为问题是,你正在使用的参数类为删除参数。参数类是一个基类,它不包含你想要的信息 - 它不会从删除按钮被点击的行中拿起ID,这不会传递给删除命令,而且我会假设你得到一个SQL异常。 (或者你也许会得到一个不同的错误,因为它试图传递两个id参数,并且找不到一个接受两个的函数。)没有调查过)

如果删除删除参数,将id设置为DataKeyName意味着它应该自动传递给您的delete命令。

以上信息不正确。除了带有自动生成的删除按钮的DataKeyName外,使用删除参数似乎不会引起任何问题。

实际的问题是使用DataSource关联GridView和SQLDataSource,而不是DataSourceID。 DataSource不会在回发中保留,而DataSourceID则会保留。我并不完全确定底下发生了什么,但在页面生命周期中抛出的DataSource会导致Delete方法调用失败,因此它永远不会发生。使用控件作为数据源时使用DataSourceID属性,使用对象(例如:DataTable)作为数据时,使用DataSource属性。

+0

我已经删除了该行,并获得了相同的内容。 – Rimo72

+0

它给你一个错误,一个SQL异常或什么?我的猜测是,DataKeyNames对AutoGenerateColumns(默认为true)不起作用,但很难说。 – PRATANTIA

+0

试过双方也删除了DataKeyName并添加了删除参数。相同结果 – Rimo72