Невозможно привести объект типа System.Web.UI.WebControls.GridView в ASP.NET - PullRequest
7 голосов
/ 19 января 2012

Я написал метод, который удаляет строки из моего Gridview asp.net при нажатии кнопки удаления, и другой метод, когда нажимается кнопка редактирования. Кнопки «Редактировать» и «Удалить» являются частью встроенных элементов управления gridview.

Однако, когда я нажимаю эти кнопки (редактировать / удалять), возникает исключение. Невозможно привести объект типа 'System.Web.UI.WebControls.GridView' к типу 'System.Web.UI.WebControls.Button'. , который указывает на строку

Button btn = (Button)sender;

Проблема здесь в том, что эта строка не связана ни с одним из методов редактирования или удаления. Это связано с кнопкой asp в другом столбце, и по этой причине я потерялся. Как я могу решить эту проблему? Что вызывает конфликты как OnRowDeleting, так и OnRowEditing с методом showResponses?

Аспкс

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

Любая помощь будет высоко ценится.

Ответы [ 3 ]

10 голосов
/ 19 января 2012

Мне это кажется достаточно понятным. Здесь:

<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");            
}
0 голосов
/ 13 июня 2017
var btnSender = (Button)e.CommandSource;
0 голосов
/ 19 января 2012

Добавьте атрибут CommandName к кнопке 1 в GridView.

<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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...