web-dev-qa-db-ja.com

gridviewで、ボタンにrowcommandイベントを使用する方法

Aspxでgridviewを使用していますが、登録とdetails.aspxの2つのページがあります。登録が完了すると、details.aspxの詳細ページに移動する必要があります。GVでgridviewを保持しているので、ボタンに行コマンドイベントを使用することになっています。そのためにアイテムテンプレートを使用したすべての学生の最後の列として編集ボタンを使用して、学生のすべての結果を表示する必要があります。しかし、行コマンドイベントでは、ユーザーが[編集]をクリックした場合に書き込む関数がわかりません。ユーザーIDを使用して編集ページに移動します。IDは正午に編集可能モードで、他のフィールドは編集可能です。

details.aspx

   <asp:GridView ID="GridView3" runat="server" CellPadding="3" ForeColor="#333333" GridLines="None" AutoGenerateColumns="false"  OnRowCommand="GridView3_RowCommand" OnSelectedIndexChanged="GridView3_SelectedIndexChanged">
     <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
         <Columns>
             <asp:BoundField DataField="UserName" HeaderText="UserName" ReadOnly="True"/>
             <asp:BoundField DataField="Password" HeaderText="Password" />
             <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
             <asp:BoundField DataField="LastName" HeaderText="LastName" />
             <asp:BoundField DataField="EMail" HeaderText="Emaid-ID" />
             <asp:BoundField DataField="PhoneNo" HeaderText="Phone Number" />
             <asp:BoundField DataField="Location" HeaderText="Location" />

              <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                   <asp:Button ID="btnedit" runat="server" Text="Edit" CommandName="Edit" CommandArgument="UserName"/>
                </ItemTemplate>          
             </asp:TemplateField> 
         </Columns>
     <EditRowStyle BackColor="#999999" />
     <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
     <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
     <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
     <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
     <SortedAscendingCellStyle BackColor="#E9E7E2" />
     <SortedAscendingHeaderStyle BackColor="#506C8C" />
     <SortedDescendingCellStyle BackColor="#FFFDF8" />
     <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
 </asp:GridView>
    </div>
</form>

details.aspx.cs

 protected void Page_Load(object sender, EventArgs e)
 {
    string connection2 = System.Web.Configuration.WebConfigurationManager.ConnectionStrings        ["connection1"].ConnectionString;
    SqlConnection con = new SqlConnection(connection2);
    con.Open();
    SqlCommand cmd = new SqlCommand("select * from User_Information", con);
    SqlDataReader rdr = cmd.ExecuteReader();
    GridView3.DataSource = rdr;
    GridView3.DataBind();
    con.Close();
}
protected void GridView3_RowCommand(object sender, GridViewCommandEventArgs e)
{

}


protected void GridView3_SelectedIndexChanged(object sender, EventArgs e)
{

}

}

5

まず、ボタンコントロールのCommandArgumentプロパティは、各行に一意の値を持っている必要があります。

 <asp:Button ID="btnedit" runat="server" Text="Edit" CommandName="Edit" 
             CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" />

次に、GridView3_RowCommandイベントの背後にあるコードに、次のコードのようなものがあります。

protected void GridView3_RowCommand(object sender, GridViewCommandEventArgs e)
{
    int index = 0;
    GridViewRow row;
    GridView grid = sender as GridView;

    switch (e.CommandName)
    {
        case "Edit":
            index = Convert.ToInt32(e.CommandArgument);
            row = grid.Rows[index];

            //use row to find the selected controls you need for edit, update, delete here
            // e.g. HiddenField value = row.FindControl("hiddenVal") as HiddenField;

            break;
    }
}
6
Ali

これを行う2つの方法

方法1

マークアップでこれらを変更してください

  1. 変更_CommandName="EditUserName"_
  2. CommandArgumentを省略します。これは必要ありません

コードビハインド

_protected void GridView3_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "EditUserName")
    {
        //first find the button that got clicked
        var clickedButton = e.CommandSource as Button;
        //find the row of the button
        var clickedRow = clickedButton.NamingContainer as GridViewRow;
        //now as the UserName is in the BoundField, access it using the cell index.
        var clickedUserName = clickedRow.Cells[0].Text;
    }
}
_

方法2

CommandArgumentを与えます。あなたはこれらのような多くの異なる議論をすることができます

  1. _CommandArgument="<%# Container.DataItemIndex %>"_
  2. _CommandArgument="<%# Container.DisplayIndex %>"_
  3. CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"ALiが提供したもの

今コードで、これを行います

_protected void GridView3_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "EditUserName")
    {            
        var clickedUserName = CustomersTable
            .Rows[Convert.ToInt32(e.CommandArgument)]//find the row with the clicked index
            .Cells[0]//find the index of the UserName cell
            .Text;//grab the text
    }
}
_

追伸:

1. CommandNameを変更する理由は、_CommandName="Edit"_の場合、RowEditingイベントが発生し、このエラーが発生するためです。

GridView'GridView3 'は、処理されなかったイベントRowEditingを発生させました。

2.Page_Loadコードをif(!IsPostBack)内に配置します。そうしないと、上記のメソッドは機能しません。

6
naveen