2017-04-26 147 views
0

我希望能夠刪除一行,當我點擊該gridview上的刪除按鈕。我有aspx頁面和代碼,以及應用程序代碼。 DeletePaymentCondition運行存儲過程以刪除行。但不知何故,總碼不起作用從gridview刪除行sql

ASPX

<asp:GridView ID="gridview1" runat="server" HorizontalAlign="left" AutoGenerateColumns="false" CssClass="table table-bordered " GridLines="None" 
     AllowSorting="True" OnRowDeleting="OnRowDeleting"> 
     <Columns> 
      <asp:TemplateField ItemStyle-HorizontalAlign="left" HeaderText="Payment Condition" HeaderStyle-CssClass="OGColor" HeaderStyle-ForeColor="white" SortExpression="monthToQuarters"> 
       <ItemTemplate> 
         <span style="font-size:12px; color: #2980b9; text-align:left"> 
         <asp:Label ID="lblUserId" runat="server" Visible="true" Text="<%# bind('payConditionId')%>"/> 
</span> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:CommandField ButtonType="Link" ShowEditButton="true" ShowDeleteButton="true" ItemStyle-Width="150"/>   
     </Columns> 
    </asp:GridView> 

cs 



protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     Label lblEmpID = (Label)gridPayment.Rows[e.RowIndex].FindControl("lblUserId"); //This is Table Id load on Label1 

     int id = Convert.ToInt32(lblEmpID.Text.ToString()); 


     dsPayment = objcommission.Delete(id); 
     gridPayment.DataSource = dsPayment.Tables[0]; 
     gridPayment.DataBind(); 

    } 

應用程序代碼

public DataSet DeletePayment(int id) 
{ 
    DataSet dsGetAllPayment; 
    dsGetAllPaymentCondition = SqlHelper.ExecuteDataset(OGconnection, CommandType.Text, "Delete FROM tblPay where pay ='" + id + "'"); 
    return dsGetAllPayment; 
} 
+0

「payConditionId」字段的數據類型是什麼?我認爲'DeletePaymentCondition'有一個存儲過程,但它看起來像一個內聯的sql語句。 –

回答

1

你建議立即進行刪除執行兩個不同的SQL,一個用於刪除和一個新的選擇一箇中檢索新的數據。

DELETE應該在NonQuery中執行,因爲它不返回行(僅影響行數)。

public DataSet DeletePaymentCondition(int ids) 
{ 
    int rowsAffected = SqlHelper.ExecuteNonQuery(OGconnection, CommandType.Text, "Delete FROM [Accounting].[dbo].[tblPayConditions] where payConditionId ='" + ids + "'"); 
    DataSet dsGetAllPaymentCondition = SqlHelper.ExecuteDataSet(OGconnection, CommandType.Text, "Select * FROM [Accounting].[dbo].[tblPayConditions]"); 
    return dsGetAllPaymentCondition; 
} 

作爲一個很好的實踐,你應該考慮將它改爲參數化查詢。在這種情況下,它是安全的,因爲整數轉換,但在類似的代碼與字符串參數,你會傾向於SQL注入攻擊

+0

很長一段時間沒有完成網頁表單,但是如果你點擊gridviewrow上的刪除,你不應該重新綁定數據。我認爲它會自動刪除該行並將其餘的數據留在那裏。 –

+0

仍然會刪除該行..可能我的.cs或.aspx代碼有錯誤 –

+0

在運行ExecuteNonQuery之後設置一個斷點並檢查'rowsAffected'變量,它的值應該大於零。在ExecuteNonQuery之前檢查'ids'的值。表中有該ID的記錄嗎? – bradbury9

0

我得到的解決方案。我對cs文件以及bradbury9提供的代碼進行了更改。

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 

     int index = Convert.ToInt32(gridPaymentCondition.DataKeys[e.RowIndex].Value.ToString()); 

     dsPaymentCondition = objcommission.DeletePaymentCondition(index); 
     gridPaymentCondition.DataSource = dsPaymentCondition.Tables[0]; 

     updatePaymentConditionsWithoutRefresh(); 
    } 
+1

很高興幫助。如果答案對您有幫助,我會建議將其標記爲有幫助 – bradbury9

+0

另外,我必須將DataKeyNames =「lblUserId」放在gridview中才能使用。但再次感謝! –