我如何知道触发哪些按钮以执行Gridview中的特定任务

时间:2019-04-06 04:12:54

标签: asp.net gridview

我有2个按钮,其中一个称为“接受”,用于更新数据库,而另一个称为“查看”,用于重定向。但是,在GridView的SelectedIndexChanged中,我无法验证单击了哪些按钮

所以我尝试将RowCommand用于“视图”按钮,将SelectedIndexChanged用于“接受”按钮。但是RowCommand触发了SelectedIndexChanged事件处理程序中的“接受”按钮。

    <asp:GridView ID="QgridView" AutoGenerateColumns="False" 
     CssClass="table table-bordered" AllowPaging="True" PageSize="6" 
    BackColor="White" BorderColor="Black" BorderStyle="Solid" 
     ForeColor="Black" GridLines="None" runat="server" 
     OnRowCommand="QgridView_RowCommand" 
    OnSelectedIndexChanged="QgridView_SelectedIndexChanged" >
    <Columns>

      <asp:TemplateField HeaderText="No"> 
             <ItemTemplate>
               <span>
              <%#Container.DataItemIndex + 1%>
              </span>
              </ItemTemplate>
        </asp:TemplateField>

        <asp:ImageField HeaderText="Image" DataImageUrlField="coverimg" >
         <ControlStyle CssClass="coverimage"/>
          <ItemStyle HorizontalAlign="Center" />                                                
             </asp:ImageField>

        <asp:BoundField HeaderText="Buyer" DataField="buyer" />
        <asp:BoundField HeaderText="Item" DataField="item" />
        <asp:BoundField HeaderText="Price offered" DataField="price" />


         <asp:buttonfield buttontype="Button" 
           commandname="Accept"
           text="Accept"/>

         <asp:BoundField DataField="quoteid"  HeaderText="quoteid" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" >                                        
        <HeaderStyle CssClass="hiddencol"></HeaderStyle>
          <ItemStyle CssClass="hiddencol"></ItemStyle>
         </asp:BoundField>

     <asp:BoundField DataField="id" HeaderText="id" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol">
      <HeaderStyle CssClass="hiddencol"></HeaderStyle>
      <ItemStyle CssClass="hiddencol"></ItemStyle>
                            </asp:BoundField>

   <asp:BoundField DataField="rtype" HeaderText="rtype" ItemStyle- 
      CssClass="hiddencol" HeaderStyle- CssClass="hiddencol">
        <HeaderStyle CssClass="hiddencol"></HeaderStyle>
        <ItemStyle CssClass="hiddencol"></ItemStyle>
    </asp:BoundField>

    <asp:BoundField DataField="seller" HeaderText="seller" ItemStyle- 
        CssClass="hiddencol" HeaderStyle-CssClass="hiddencol">
        <HeaderStyle CssClass="hiddencol"></HeaderStyle>
         <ItemStyle CssClass="hiddencol"></ItemStyle>
    </asp:BoundField>


      <asp:buttonfield buttontype="Button" 
        commandname="View"
       text="View"/>



    </Columns>
       </asp:GridView>

  // Behind COde page
  protected void QgridView_SelectedIndexChanged(object sender, EventArgs e)
    {

        GridViewRow row = QgridView.SelectedRow;
        string seller = row.Cells[10].Text;
        string item = row.Cells[4].Text;
        string type = row.Cells[9].Text;
        int id = Convert.ToInt32(row.Cells[8].Text);
        int quoteid = Convert.ToInt32(row.Cells[7].Text);
        productDAO productdao = new productDAO();
        productdao.GridPush(quoteid, id)

    }

    protected void QgridView_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "View")
        {
            Response.Redirect("ListingItems.aspx");

        }          
    }

我希望“接受”按钮执行数据库更新,而“查看”按钮执行Response.Redirect。但是,RowCommand不会触发,而是触发SelectedIndexChanged中的“接受”按钮。我想知道如何可以为每个按钮执行不同的任务?

[从GridView获取行数据]

   protected void QgridView_RowCommand(object sender, 
   GridViewCommandEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("onrowcommand");

        if (e.CommandName == "View")
        {
            System.Diagnostics.Debug.WriteLine("ButtonView is clicked");
            Response.Redirect("ListingItems.aspx");

        }

        else if (e.CommandName == "Accept")
        {
            System.Diagnostics.Debug.WriteLine("buttonAccept is clicked");
            productDAO productdao = new productDAO();
            //GridViewRow row = QgridView.SelectedRow;

            int index = Convert.ToInt32(e.CommandArgument);
            GridViewRow row = QgridView.Rows[index];

            string id = row.Cells[8].Text; //Returns me nothing
        }

        else
        {
            System.Diagnostics.Debug.WriteLine("no command name");
        }


    }

2 个答案:

答案 0 :(得分:0)

我认为您无需检查rowcommand或onselected索引更改事件,您可以直接在click事件上设置按钮。如果您在Gridview中使用内部,那么您应该能够在按钮代码中注册一个事件,如下所示:

<asp:Button runat="server" OnClick="YourclickEvent" />

有关事件的更多详细信息,请阅读:https://www.codeproject.com/Articles/50540/GridView-Event-Handling

一个补充:如果使用行命令,则用命令名称标识每个按钮,您可以轻松地执行任务。

答案 1 :(得分:0)

根据您的代码SelectedIndexChanged,切勿触发(无select命令)。
RowCommand处理程序始终首先触发(在更具体的处理程序之前)。
查看示例工作代码。

.aspx

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="CategoryID" 
    DataSourceID="sqlCategory" 
    OnSelectedIndexChanged="GridView1_SelectedIndexChanged"  
    OnRowCommand="GridView1_RowCommand" AllowPaging="True">
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" InsertVisible="False" ReadOnly="True" SortExpression="CategoryID" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category Name" SortExpression="CategoryName" />
        <asp:ButtonField ButtonType="Button" CommandName="Accept" HeaderText="Accept" ShowHeader="True" Text="Accept" />
        <asp:ButtonField ButtonType="Button" CommandName="View" HeaderText="View" ShowHeader="True" Text="View" />
        <%-- Use HyperLinkField instead of ButtonField --%>
        <asp:HyperLinkField DataNavigateUrlFields="CategoryID" DataNavigateUrlFormatString="category.aspx?categoryid={0}" DataTextField="CategoryName" DataTextFormatString="View {0}" HeaderText="Direct View" />
        <asp:CommandField ButtonType="Button" ShowEditButton="True" />
    </Columns>
</asp:GridView>
<%-- Data from NorthWind learning DB --%>
<asp:SqlDataSource ID="sqlCategory" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnection %>" 
    SelectCommand="SELECT CategoryID, CategoryName FROM Categories" 
    UpdateCommand="update categories set categoryName=@CategoryName where CategoryID=@CategoryID">
    <UpdateParameters>
        <asp:Parameter Name="CategoryID" Type="Int32" />
        <asp:Parameter Name="CategoryName" Type="String" />
    </UpdateParameters>
</asp:SqlDataSource>

.aspx.cs

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    Trace.Write("GridView1_SelectedIndexChanged");// fired by "select" command after RowCommand finished 
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Trace.Write("GridView1_RowCommand");
    //
    if (e.CommandName == "Accept")
    {
        var categoryId = (int)GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;//e.CommandArgument is display index
        Trace.Write(e.CommandName + ": " + e.CommandArgument + " : " + categoryId.ToString());
    }
    else if (e.CommandName == "View")
    {
        Trace.Write("View " + e.CommandArgument);
    }
}