无法在ASP.NET中强制转换System.Web.UI.WebControls.GridView类型的对象

HGo*_*mez 7 c# asp.net gridview exception

我编写了一个方法,当单击删除按钮时,从我的asp.net Gridview中删除行,以及单击编辑按钮时的另一种方法."编辑"和"删除"按钮都是内置gridview控件的一部分.

但是当我按下这些按钮(编辑/删除)并抛出异常时. 无法将类型为"System.Web.UI.WebControls.GridView"的对象强制转换为"System.Web.UI.WebControls.Button".这是指向该线

Button btn = (Button)sender;
Run Code Online (Sandbox Code Playgroud)

这里的问题是该行与编辑或删除方法无关.它与另一列中的asp按钮有关,因此我迷失了.我该如何解决这个问题?什么导致OnRowDeleting和OnRowEditing与showResponses方法冲突?

这是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>
Run Code Online (Sandbox Code Playgroud)

以下是代码背后的代码:

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");            
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感谢.

Jon*_*eet 10

对我来说似乎相当清楚.这里:

<asp:GridView runat="server" ... OnRowCommand="showResponses"> 
Run Code Online (Sandbox Code Playgroud)

你将RowCommand事件绑定到showResponses.在这里,showResponses你假设发件人是一个按钮:

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");            
}
Run Code Online (Sandbox Code Playgroud)

发件人不是按钮 - 它是网格视图.如果你想要命令参数,你应该使用GridViewCommandEventArgs.CommandArgument.

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