【问题标题】:Unable to cast object of type System.Web.UI.WebControls.GridView in ASP.NET无法在 ASP.NET 中投射 System.Web.UI.WebControls.GridView 类型的对象
【发布时间】:2012-02-13 17:09:05
【问题描述】:

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

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

Button btn = (Button)sender;

这里的问题是这一行与编辑或删除方法都无关。它与另一列中的 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>

下面是代码:

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");            
}

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net exception gridview


    【解决方案1】:

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

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

    您将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");            
    }
    

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

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

    【讨论】:

    • 谢谢。我在&lt;asp:Button runat="server" ID="button1" CommandArgument='&lt;%# Eval("QuestionnaireID") %&gt;' OnClick="showResponses" text="Results"/&gt; 线上收到错误No overload for 'showResponses' matches delegate 'System.EventHandler' 我该如何解决?
    • @Rupert:基本上,为该事件使用不同的处理程序。在适当地提取 CommandArgument 之后,您可能希望让两个处理程序调用同一个方法。
    • @JonSkeet 应该使用哪个事件处理程序?看来 onRowCommand 与 OnRowDeleting 处理程序冲突。我将如何提取相关的CommandArgument?我对 Gridview 控件的经验有限,所以我不知道要使用哪个事件处理程序。
    • @Rupert:我不知道何时使用哪个事件的详细信息 - 但您已经知道如何通过单击按钮获取命令参数 - 因为您之前有过该代码。您不能对按钮单击 RowCommand 事件使用相同的代码。
    • 终于想通了。谢谢=]
    【解决方案2】:

    在 GridView 中为 button1 添加一个 CommandName 属性。

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

    然后在 showResponses 中执行此操作...

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

    【讨论】:

      【解决方案3】:
      var btnSender = (Button)e.CommandSource;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2015-07-12
        • 1970-01-01
        • 2017-01-21
        • 2016-01-17
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        相关资源
        最近更新 更多