Pregunta No se puede convertir el objeto de tipo System.Web.UI.WebControls.GridView en ASP.NET


Escribí un método que elimina las filas de mi asp.net Gridview cuando se hace clic en el botón Eliminar y otro método para cuando se hace clic en el botón editar. Los botones Editar y Eliminar son parte de los controles incorporados de gridview.

Sin embargo, cuando presiono estos botones (editar / eliminar) y se lanza una excepción. No se puede convertir el objeto del tipo 'System.Web.UI.WebControls.GridView' para escribir 'System.Web.UI.WebControls.Button'. que está apuntando a la línea

Button btn = (Button)sender;

El problema aquí es que esta línea no está relacionada con ninguno de los métodos de edición o eliminación. Está relacionado con el botón asp en otra columna, y por esa razón estoy perdido. ¿Cómo puedo resolver este problema? ¿Qué está causando el conflicto entre OnRowDeleting y OnRowEditing con el método showResponses?

Aquí está el 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>

Y aquí está el código detrás:

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

Cualquier ayuda sería muy apreciada.


7
2018-01-18 23:59


origen


Respuestas:


Me parece razonablemente claro. Aquí:

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

usted ata el RowCommand evento para showResponses. Y aquí, en showResponses, supones que el remitente es un botón:

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

El remitente no es un botón - es la vista de cuadrícula. Si desea el argumento del comando, debe usar GridViewCommandEventArgs.CommandArgument.

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

10
2018-01-19 00:05



Agregue un atributo CommandName a su button1 en GridView.

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

Luego en showResponses haz esto ...

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

0
2018-01-19 00:12



var btnSender = (Button)e.CommandSource;

0
2018-06-12 21:04