2012-01-18 37 views
7

Tôi đã viết một phương thức xóa các hàng khỏi Gridview asp.net của tôi khi nút xóa được nhấp và một phương thức khác cho khi nút chỉnh sửa được nhấp. Cả nút Chỉnh sửa và Xóa là một phần của các điều khiển xem lưới được tích hợp sẵn.Không thể truyền đối tượng thuộc loại System.Web.UI.WebControls.GridView trong ASP.NET

Tuy nhiên, khi tôi nhấn các nút này (chỉnh sửa/xóa) và ngoại lệ sẽ được ném. Không thể truyền đối tượng thuộc loại 'System.Web.UI.WebControls.GridView' để nhập 'System.Web.UI.WebControls.Button'. được chỉ vào dòng

Button btn = (Button)sender; 

Vấn đề ở đây là dòng này không liên quan đến một trong các chỉnh sửa hoặc xóa các phương pháp. Nó liên quan đến nút asp trong cột khác, và vì lý do đó tôi bị mất. Làm thế nào tôi có thể giải quyết vấn đề này? Điều gì gây ra cả xung đột OnRowDeleting và OnRowEditing với phương thức showResponses?

Đây là aspx

<asp:GridView runat="server" ID="gvShowQuestionnaires" HeaderStyle-CssClass="table_header" CssClass="view" AlternatingRowStyle-CssClass="alt" AlternatingRowStyle-BackColor="#f3f4f8" AutoGenerateColumns="False" 
       DataKeyNames='QuestionnaireID' OnRowDeleting="gvShowQuestionnaires_RowDeleting" OnRowEditing="gvShowQuestionnaires_RowEdit" FooterStyle-CssClass="view_table_footer" OnRowCommand="showResponses"> 
    <Columns> 
     <asp:BoundField DataField="QuestionnaireID" HeaderText="ID" HeaderStyle-Width="80px" ItemStyle-CssClass="bo"></asp:BoundField> 
     <asp:BoundField DataField="QuestionnaireName" HeaderText="Questionnaire Name" />   
     <asp:TemplateField HeaderText="Results" HeaderStyle-Width="150px"> 
      <ItemTemplate> 
       <asp:Button runat="server" ID="button1" CommandArgument='<%# Eval("QuestionnaireID") %>' OnClick="showResponses" text="Results"/> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField HeaderText="Options" ShowDeleteButton="True" ShowEditButton="true" EditText="Edit"></asp:CommandField> 
    </Columns> 
</asp:GridView> 

Và đây là đoạn code sau:

protected void gvShowQuestionnaires_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    int questionnaireID = (int)gvShowQuestionnaires.DataKeys[Convert.ToInt32(e.RowIndex)].Value; 
    GetData.DeleteQuestionnaire(questionnaireID); 
    gvShowQuestionnaires.DataSource = DT; 
    gvShowQuestionnaires.DataBind(); 
} 

protected void gvShowQuestionnaires_RowEdit(object sender, GridViewEditEventArgs e) 
{ 
    string id = gvShowQuestionnaires.Rows[e.NewEditIndex].Cells[0].Text; 
    Session["qID"] = id; 
    Response.Redirect("~/members/edit_questionnaire.aspx"); 
} 

protected void showResponses(object sender, EventArgs e) 
{ 
    Button btn = (Button)sender; 
    string id = btn.CommandArgument.ToString(); 
    Session["qID"] = id; 
    Response.Redirect("~/members/questionnaire_responses.aspx");    
} 

Bất kỳ trợ giúp sẽ nhiều đánh giá cao.

Trả lời

10

Điều này có vẻ hợp lý đối với tôi. Tại đây:

<asp:GridView runat="server" ... OnRowCommand="showResponses"> 

bạn ràng buộc sự kiện RowCommand tới showResponses. Và ở đây, trong showResponses, bạn cho rằng người gửi là một nút:

protected void showResponses(object sender, EventArgs e) 
{ 
    Button btn = (Button)sender; 
    string id = btn.CommandArgument.ToString(); 
    Session["qID"] = id; 
    Response.Redirect("~/members/questionnaire_responses.aspx");    
} 

Người gửi không phải là một nút - đó là xem lưới. Nếu bạn muốn đối số lệnh, bạn nên sử dụng GridViewCommandEventArgs.CommandArgument.

protected void showResponses(object sender, GridViewCommandEventArgs e) 
{ 
    Session["qID"] = e.CommandArgument; 
    Response.Redirect("~/members/questionnaire_responses.aspx");    
} 
+0

Đây là câu trả lời người đàn ông – Mubarek

+0

Cảm ơn. Tôi đang gặp lỗi 'Không quá tải' đối với 'các đối tác của showResponses' khớp với đại biểu 'System.EventHandler'' trên dòng ' 'Làm thế nào tôi có thể giải quyết vấn đề này? – HGomez90

+0

@Rupert: Về cơ bản, hãy sử dụng trình xử lý khác cho sự kiện đó. Bạn cũng có thể muốn làm cho cả hai trình xử lý gọi vào cùng một phương thức sau khi giải nén 'CommandArgument' một cách thích hợp. –

0

Thêm thuộc tính CommandName vào nút1 của bạn trong GridView.

<asp:Button runat="server" ID="button1" CommandName="Button1" CommandArgument='<%# Eval("QuestionnaireID") %>' OnClick="showResponses" text="Results"/> 

Sau đó, trong showResponses làm điều này ...

protected void showResponses(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "Button1") { 
     Session["qID"] = e.CommandArgument; 
     Response.Redirect("~/members/questionnaire_responses.aspx"); 
    } 
} 
Các vấn đề liên quan