2015-07-02 212 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