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

C# 无法在ASP.NET中强制转换System.Web.UI.WebControl.GridView类型的对象,c#,asp.net,exception,gridview,C#,Asp.net,Exception,Gridview,我编写了一个方法,在单击delete按钮时从asp.net Gridview中删除行,在单击edit按钮时删除行。 编辑和删除按钮都是内置gridview控件的一部分 但是,当我按下这些按钮(编辑/删除)时,会引发异常。 无法将类型为“System.Web.UI.WebControls.GridView”的对象强制转换为类型为“System.Web.UI.WebControls.Button”。该对象指向该行 Button btn = (Button)sender; 这里的问题是,这一行与ed

我编写了一个方法,在单击delete按钮时从asp.net Gridview中删除行,在单击edit按钮时删除行。 编辑和删除按钮都是内置gridview控件的一部分

但是,当我按下这些按钮(编辑/删除)时,会引发异常。 无法将类型为“System.Web.UI.WebControls.GridView”的对象强制转换为类型为“System.Web.UI.WebControls.Button”。该对象指向该行

Button btn = (Button)sender;
这里的问题是,这一行与edit或delete方法都不相关。它与另一列中的asp按钮有关,因此我迷路了。我如何解决这个问题?是什么导致OnRowDelete和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>

任何帮助都将不胜感激。

我似乎相当清楚。在这里:

<asp:GridView runat="server" ... OnRowCommand="showResponses"> 
发送者不是按钮,而是网格视图。如果需要命令参数,应该使用


向GridView中的按钮1添加CommandName属性

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

谢谢我在
行上得到一个错误
showResponses'与委托'System.EventHandler'
匹配时没有重载。如何解决这个问题?@Rupert:基本上,对该事件使用不同的处理程序。在适当地提取
CommandArgument
后,您可能希望使两个处理程序调用同一个方法。@jonskey应该使用哪个事件处理程序?onRowCommand似乎与OnRowDeleting处理程序冲突。如何提取相关的
命令参数
?我使用Gridview控件的经验有限,因此我不知道使用哪个事件处理程序。@Rupert:我不知道何时使用哪个事件的详细信息,但您已经知道如何通过单击按钮获取命令参数,因为您以前有过该代码。你不能对按钮点击和RowCommand事件使用相同的代码。谢谢你
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");            
}
protected void showResponses(object sender, GridViewCommandEventArgs e)
{
    Session["qID"] = e.CommandArgument;
    Response.Redirect("~/members/questionnaire_responses.aspx");            
}
<asp:Button runat="server" ID="button1" CommandName="Button1" CommandArgument='<%# Eval("QuestionnaireID") %>' OnClick="showResponses" text="Results"/>
protected void showResponses(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Button1") {
         Session["qID"] = e.CommandArgument;
         Response.Redirect("~/members/questionnaire_responses.aspx");
    }
}
var btnSender = (Button)e.CommandSource;