首页 > 解决方案 > .NET C#中gridview中的DropDownList和分页冲突

问题描述

这是我在.NET c#中的gridview,带有分页

    <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;
        }
    }
}

我不明白为什么会这样?

如何解决这个问题?

提前感谢您的帮助

标签: c#asp.netgridview

解决方案


推荐阅读