2012-01-18 40 views
7

削除ボタンがクリックされたときにasp.net Gridviewから行を削除するメソッドを書きましたが、編集ボタンをクリックします。 編集ボタンと削除ボタンは、組み込みのgridviewコントロールの一部です。ASP.NETでSystem.Web.UI.WebControls.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");    
} 

任意の助けに感謝します。

答えて

10

私にはかなり合理的なようです。ここで:

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

あなたはshowResponsesRowCommandイベントをバインドします。そして、ここでは、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

これが答えの男 – Mubarek

+0

おかげで...これを行います。 ' 'OnClick = "showResponses" text = "結果" /> 'これをどのように解決できますか? – HGomez90

+0

@Rupert:基本的に、そのイベントには別のハンドラを使用します。 'CommandArgument'を適切に抽出した後、両方のハンドラを同じ単一のメソッドに呼び出させたいと思うかもしれません。 –

0

GridViewのbutton1にCommandName属性を追加します。 showResponsesで次に

<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"); 
    } 
} 
0
var btnSender = (Button)e.CommandSource; 
関連する問題