2016-09-26 16 views
0

"Reviewer"역할을 가진 사용자를 표시 할 페이지에 아래 gridview가 있습니다. 그리드가 레코드를 올바르게 위로 가져옵니다. gridview에서 검토 자 역할을 제거하는 "삭제"버튼이 있습니다. 수동으로 실행하면 호출 된 저장 프로 시저가 올바르게 작동하지만 aspx 또는 codebehind 페이지에서 오류가 반환되지 않고 레코드가 삭제되지 않는 것처럼 뭔가가 누락 된 것처럼 보입니다. gridview에 대한ASP.NET 응용 프로그램에서 gridview에서 레코드 삭제

영문 제어 : 뒤에 전체 코드를 업데이트

<asp:GridView ID="GridView1" runat="server" Caption="Current Reviewers" AllowSorting="True" PagerSettings-Mode="NumericFirstLast" OnPageIndexChanging="GridView1_PageIndexChanging" 
CaptionAlign="Top" EmptyDataText="No Reviewers Configured." PageSize="10" AllowPaging="true" PagerStyle-HorizontalAlign="Center" PagerStyle-Font-Size="Large" 
AutoGenerateColumns="false" AlternatingRowStyle-BackColor="#cccccc" DataKeyNames="UserId" OnRowDeleting="DeleteRecord"> 
<Columns> 

    <asp:BoundField DataField="UserId" HeaderText="Id" ItemStyle-Width="300" /> 
    <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="250" /> 
    <asp:TemplateField HeaderText="Delete?"> 
        <ItemTemplate> 
         <span onclick="return confirm('Are you sure to Delete the record?')"> 
          <asp:LinkButton ID="lnkB" runat="Server" Text="Delete" CommandArgument='<%# Eval("UserId") %>' CommandName="DeleteRecord"></asp:LinkButton> 
         </span> 
        </ItemTemplate> 
       </asp:TemplateField> 
</Columns> 

</asp:GridView> 

:

namespace cs1.Admin 
{ 
public partial class ReviewerMaintenance : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindDropDownList1(); 
     } 
    } 
    private void BindDropDownList1() 
    { 

     string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 
     string selectSQL = String.Format("SELECT Id as UserId, FirstName + ' ' + LastName As Name from AspNetUsers where Id in(SELECT UserId from AspNetUserRoles where RoleId = 1)"); 
     SqlConnection con = new SqlConnection(connectionString); 
     SqlCommand cmd = new SqlCommand(selectSQL, con); 
     SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 

     adapter.Fill(ds, "Reviewer"); 

     GridView1.DataSource = ds; 
     GridView1.DataBind(); 
    } 
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     GridView1.PageIndex = e.NewPageIndex; 
     BindDropDownList1(); //bindgridview will get the data source and bind it again 
    } 

    protected void DeleteRecord(object sender, GridViewDeleteEventArgs e) 
    { 
     string UserId = GridView1.DataKeys[e.RowIndex].Value.ToString(); 
     SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString()); 
     SqlCommand dCmd = new SqlCommand(); 
     { 
      conn.Open(); 
      dCmd.CommandText = "Reviewer_Delete"; 
      dCmd.CommandType = CommandType.StoredProcedure; 
      dCmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = UserId; 
      dCmd.Connection = conn; 
      dCmd.ExecuteNonQuery(); 
      // Refresh the data 

      BindDropDownList1(); 
      dCmd.Dispose(); 
      conn.Close(); 
      conn.Dispose(); 

     } 

    } 


} 
} 
+1

'DeleteRecord' 메소드에 중단 점을 넣으면 충돌합니까? 메서드 바인딩에 사용하는 구문이 정확한지 잘 모르겠습니다. – TZHX

+1

생성 한 저장 프로 시저를 볼 수 있습니까? – Auguste

+0

@TZHX - 중단 점을 넣으려고 시도했지만 코드가 멈추고 예상대로 계속 진행될 것을 기다림으로써 모든 것이 호출되는 것처럼 보입니다. –

답변

0

시도는이 문제를 처리 할 수의 GridView의 OnRowCommand 이벤트를 사용할 수 있습니다. 당신의 GridView 마크 업에서

는 :

OnRowCommand="GridView1_RowCommand"가 존재 확인합니다. 코드에서

뒤에 :

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { /* Set a breakpoint here and make sure: 
      A.) You are hitting this method 
      B.) Get value of e.CommandName */ 
     if (e.CommandName == "EditRecord") 
     { 
      // Run your edit/update logic here if needed 
     } 
     if (e.CommandName == "DeleteRecord") 
     { 
      // Delete the record here 
      string UserId = GridView1.DataKeys[e.RowIndex].Value.ToString(); 
      SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString()); 
      SqlCommand dCmd = new SqlCommand(); 
      { 
       conn.Open(); 
       dCmd.CommandText = "Reviewer_Delete"; 
       dCmd.CommandType = CommandType.StoredProcedure; 
       dCmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = UserId; 
       dCmd.Connection = conn; 
       dCmd.ExecuteNonQuery(); 
       // Refresh the data 

       BindDropDownList1(); 
       dCmd.Dispose(); 
       conn.Close(); 
       conn.Dispose(); 
     } 
    } 
+0

= 'admin_reviewermaintenance_aspx'에 'GridView1_RowCommand'에 대한 정의가없고 'GridView1_RowCommand'에 'admin_reviewermaintenance_aspx'유형의 첫 번째 인수를 허용하지 않는 정의가 없습니다. 찾을 수 있습니다 (using 지시문이나 어셈블리 참조가 누락 되었습니까?) –

0

이것은 매우 간단한 일 었죠. aspx 페이지에서 "DeleteRecord"와 같은 값으로 OnRowDeleting과 CommandName 요소를 설정했습니다.

CommandName 값을 "Delete"로 변경하면 코드를 평가하고 저장 프로 시저를 성공적으로 호출 할 수있었습니다.