Конфликт выпадающего списка и разбивки на страницы в gridview в .NET C#

#c# #asp.net #gridview

#c# #asp.net #gridview

Вопрос:

это мой gridview в .NET c # с нумерацией страниц

     <asp:GridView ID="gvProducts" AutoGenerateColumns="False" EmptyDataText="ko" EnableViewState="true"
        runat="server" DataKeyNames="ID" CssClass="mGrid" HorizontalAlign="Center"
        OnRowDataBound="gvProducts_RowDataBound"
        AllowPaging="True" PageSize="10"
        OnPageIndexChanging="OnPageIndexChanging">
        <AlternatingRowStyle CssClass="altrows" />
        <Columns>
             <asp:BoundField DataField="Nr" HeaderText="Nr." ReadOnly="true" HtmlEncode="false"
                    ItemStyle-CssClass="ddl_Class_new" ItemStyle-HorizontalAlign="Center" />
            <asp:TemplateField HeaderText="Status" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:DropDownList ID="ddlstatus" runat="server" CssClass="pure-u-23-24"
                        AutoPostBack="true" OnSelectedIndexChanged="ddlstatus_SelectedIndexChanged">
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <PagerTemplate>
            <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="/aspnet/img/bot_back_1.gif"
                CommandArgument="First" CommandName="Page" />
            <asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="/aspnet/img/bot_back.gif"
                CommandArgument="Prev" CommandName="Page" />
            Page
                <asp:DropDownList ID="ddlPages" runat="server" AutoPostBack="True" CssClass="ddl_Class"
                    OnSelectedIndexChanged="ddlPages_SelectedIndexChanged">
                </asp:DropDownList>
            of
                <asp:Label ID="lblPageCount" runat="server"></asp:Label>
            <asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="/aspnet/img/bot_next.gif"
                CommandArgument="Next" CommandName="Page" />
            <asp:ImageButton ID="ImageButton4" runat="server" ImageUrl="/aspnet/img/bot_next_1.gif"
                CommandArgument="Last" CommandName="Page" />
        </PagerTemplate>
    </asp:GridView>
  

в этом gridview я добавил это dropdownlist ddlstatus

    <asp:TemplateField HeaderText="Status" ItemStyle-HorizontalAlign="Center">
        <ItemTemplate>
            <asp:DropDownList ID="ddlstatus" runat="server" CssClass="pure-u-23-24"
                AutoPostBack="true" OnSelectedIndexChanged="ddlstatus_SelectedIndexChanged">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
  

когда dropdownlist ddlstatus изменяется, мне нужно открыть новую веб-страницу в браузере

 protected void ddlstatus_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ebb = (DropDownList)sender;
    GridViewRow gvr = (GridViewRow)ebb.NamingContainer;
    string dvalue = gvr.Cells[1].Text;
    ClientScript.RegisterStartupScript(this.GetType(), "OpenWindow", "window.open('newpage.aspx?ID="   dvalue.ToString()   "');", true);
}
  

но новая веб-страница в браузере также открывается, если попытаться изменить страницу в gridview

 protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow gvrPager = gvProducts.BottomPagerRow;
    DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");
    gvProducts.PageIndex = ddlPages.SelectedIndex;
    BindData();
}

protected void Paginate(object sender, CommandEventArgs e)
{
    int intCurIndex = gvProducts.PageIndex;

    switch (e.CommandArgument.ToString().ToLower())
    {
        case "First":
            gvProducts.PageIndex = 0;
            break;
        case "Prev":
            gvProducts.PageIndex = intCurIndex - 1;
            break;
        case "Next":
            gvProducts.PageIndex = intCurIndex   1;
            break;
        case "Last":
            gvProducts.PageIndex = gvProducts.PageCount - 1;
            break;
    }
    gvProducts.DataBind();
}

protected void gvProducts_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvProducts.PageIndex = e.NewPageIndex;
    BindData();
}

protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvProducts.PageIndex = e.NewPageIndex;
    BindData();
}
  

это RowDataBound event

 protected void gvProducts_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Pager)
    {
        DropDownList ddl = (DropDownList)(e.Row.FindControl("ddlpages"));
        Label lblPageCount = (Label)e.Row.FindControl("lblPageCount");

        if (lblPageCount != null)
            lblPageCount.Text = gvProducts.PageCount.ToString();

        for (int i = 1; i <= gvProducts.PageCount; i  )
        {
            ddl.Items.Add(i.ToString());
        }

        ddl.SelectedIndex = gvProducts.PageIndex;

        if (gvProducts.PageIndex == 0)
        {
            ((ImageButton)e.Row.FindControl("ImageButton1")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton2")).Visible = false;
        }

        if (gvProducts.PageIndex   1 == gvProducts.PageCount)
        {
            ((ImageButton)e.Row.FindControl("ImageButton3")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton4")).Visible = false;
        }
    }
}
  

я не понимаю, почему это происходит?

как это решить?

заранее спасибо за любую помощь

Комментарии:

1. Повторно инициализируется ли ваше представление сетки при смене страниц? Спрашиваю, потому что вы заявили, что «в этом gridview я добавил этот выпадающий список ddlstatus». Если ваш выпадающий список является дочерним для grid, он получает индекс при загрузке, следовательно, ваше событие запускается. (не по теме: у вас должны быть события с одинаковым содержимым: gvProducts_PageIndexChanging и OnPageIndexChanging)

2. @nilsK Да, gridview повторно инициализируется с помощью BindData , когда я меняю страницы. Но я пробовал без повторной инициализации, и у меня та же проблема

3. Честно говоря, в этом случае вам лучше изменить выбор droplist в JS.

4. @SalikRafiq спасибо за ответ, у вас есть какой-нибудь пример JS для моего случая?

5. посмотрите на это w3schools.com/jsref/event_onchange.asp а затем посмотрите на window.open()