Как узнать, какие кнопки запускаются для выполнения определенной задачи в Gridview? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть 2 кнопки, одна называется «Принять», которая используется для обновления базы данных, а другая называется «Вид», которая используется для перенаправления. Однако в SelectedIndexChanged GridView я не смог проверить, какие кнопки были нажаты

, поэтому я попытался использовать 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 голосов
/ 07 апреля 2019

Согласно вашему коду 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);
    }
}
0 голосов
/ 06 апреля 2019

Я думаю, что вам не нужно проверять команду строки или выбранное событие изменения индекса, вы можете непосредственно установить кнопку на событие щелчка.если вы используете внутри своего Gridview, то вы должны иметь возможность зарегистрировать событие в коде вашей кнопки как:

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

Для более подробной информации о событии вы должны прочитать это: https://www.codeproject.com/Articles/50540/GridView-Event-Handling

Одно дополнение: если вы используете команду строки, идентифицируйте каждую кнопку с именем команды, и вы легко сможете выполнить свою задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...