【问题标题】:Dropdownlist inside a gridview not working when selection changes选择更改时,gridview中的下拉列表不起作用
【发布时间】:2014-12-22 14:40:58
【问题描述】:

我在 gridview 中有两个下拉列表。

  1. 第一个下拉菜单 -- 用于选择 Page No

  2. 第二个下拉列表 -- 用于选择 Page Size

与下拉列表相关的问题是:-

当我change 选择时,它可以正常工作并向我显示确切的结果。但是当我再次将选择带到最后一个值时,我的gridview 会中断。尝试了所有代码并进行了调试,但找不到确切的解决方案。

请查看dropdownlistdropdownlist的aspx代码:-

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
            <ContentTemplate>
                <asp:GridView ID="grdUser"
                    OnPageIndexChanging="grdUser_PageIndexChanging"
                    AutoGenerateColumns="false" EnableViewState="true"
                    AllowPaging="true"
                    OnDataBound="grdUser_DataBound"
                    runat="server"
                    Width="100%"
                    border="1"
                    DataKeyNames="Id"
                    PageSize="2">

                    <Columns>
                        <asp:TemplateField HeaderText="Select" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td">
                            <ItemTemplate>
                                <asp:CheckBox ID="chkDelete" runat="server" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="username" HeaderText="UserName" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="email" HeaderText="Email Id" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="usertype" HeaderText="UserType" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:BoundField DataField="active" HeaderText="Active" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td" />
                        <asp:TemplateField HeaderText="Action" HeaderStyle-Width="15%" ItemStyle-Width="30" HeaderStyle-CssClass="k-grid td">
                            <ItemTemplate>
                                <asp:ImageButton ID="btnDelete" AlternateText="Delete" ImageUrl="~/images/delete.png" runat="server" Width="15" Height="15" CommandName="Delete" CommandArgument='<%# Eval("Id") %>' CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this record?')" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:CommandField ButtonType="Image" ItemStyle-Width="15" EditImageUrl="~/images/edit.png" ShowEditButton="True" ControlStyle-Width="15" ControlStyle-Height="15" CancelImageUrl="~/images/close.png" UpdateImageUrl="~/images/update.png">
                            <ControlStyle Height="20px" Width="20px"></ControlStyle>
                        </asp:CommandField>
                    </Columns>

                    <PagerStyle ForeColor="Blue"
                        BackColor="LightBlue" />
                    <PagerTemplate>
                        <table style="width: 100%">
                            <tr>
                                <td class="col-md-7">
                                    <asp:Label ID="MessageLabel"
                                        ForeColor="Blue"
                                        Text="Select a page:"
                                        runat="server" />
                                    <asp:LinkButton ID="FirstLB" runat="server" CommandName="Page" CommandArgument="First" ToolTip="First"><<</asp:LinkButton>

                                    <asp:LinkButton ID="PrevLB" runat="server" CommandName="Page" CommandArgument="Prev" ToolTip="Previous"><</asp:LinkButton>
                                    <asp:DropDownList ID="PageDropDownList"
                                        AutoPostBack="true"
                                        OnSelectedIndexChanged="PageDropDownList_SelectedIndexChanged"
                                        runat="server" />
                                    <asp:LinkButton ID="NextLB" runat="server" CommandName="Page" CommandArgument="Next" ToolTip="Next">></asp:LinkButton>

                                    <asp:LinkButton ID="LastLB" runat="server" CommandName="Page" CommandArgument="Last" ToolTip="Last">>></asp:LinkButton>
                                </td>
                                <td class="col-md-3">
                                    <asp:Label ID="PageSizeLabel" runat="server" Text="Select Page Size: "></asp:Label>
                                    <asp:DropDownList ID="ddlPageSize" runat="server" OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged" AutoPostBack="true">
                                        <asp:ListItem Value="2" Text="2" />
                                        <asp:ListItem Value="5" Text="5" />
                                        <asp:ListItem Value="10" Text="10" />
                                    </asp:DropDownList>
                                </td>
                                <td class="col-md-2">
                                    <asp:Label ID="CurrentPageLabel"
                                        ForeColor="Blue"
                                        runat="server" />
                                </td>
                            </tr>
                        </table>
                    </PagerTemplate>
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>

注意:Gridview 在UpdatePanel 下。

另请参阅每个事件背后的代码和BindGrid();

protected void BindGrid()
    {
        string conString = ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString;
        SqlCommand cmd = new SqlCommand("select Id,username,email,usertype,active from tbl_User ORDER By Id DESC");
        using (SqlConnection con = new SqlConnection(conString))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    grdUser.DataSource = dt;
                    grdUser.DataBind();
                    DisablePageDirections();
                    // System.Threading.Thread.Sleep(3000);
                    //return dt;
                }
            }
        }
    }
    private void DisablePageDirections()
    {
        if (grdUser.PageIndex == 0)
        {
            (grdUser.BottomPagerRow.FindControl("FirstLB") as LinkButton).Enabled = false;
            (grdUser.BottomPagerRow.FindControl("PrevLB") as LinkButton).Enabled = false;
        }
        if (grdUser.PageIndex == grdUser.PageCount - 1)
        {
            (grdUser.BottomPagerRow.FindControl("NextLB") as LinkButton).Enabled = false;
            (grdUser.BottomPagerRow.FindControl("LastLB") as LinkButton).Enabled = false;
        }
    }
    protected void ddlPageSize_SelectedIndexChanged(Object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageSizeList = (DropDownList)pagerRow.Cells[0].FindControl("ddlPageSize");
        grdUser.PageSize = Convert.ToInt32(pageSizeList.SelectedValue);
        Context.Session["PageSize"] = pageSizeList.SelectedValue;
        BindGrid();
    }
    protected void PageDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        grdUser.PageIndex = pageList.SelectedIndex;
        BindGrid();
    }

另见gridview数据绑定事件:-

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        DropDownList pageSizeList = (DropDownList)pagerRow.Cells[0].FindControl("ddlPageSize");
        if (Context.Session["PageSize"] != null)
        {
            pageSizeList.SelectedValue = Context.Session["PageSize"].ToString();
        }
        // Retrieve the DropDownList and Label controls from the row.
        DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
        if (pageList != null)
        {
            for (int i = 0; i < grdUser.PageCount; i++)
            {
                int pageNumber = i + 1;
                ListItem item = new ListItem(pageNumber.ToString());
                if (i == grdUser.PageIndex)
                {
                    item.Selected = true;
                }
                pageList.Items.Add(item);
            }
        }
        if (pageLabel != null)
        {
            int currentPage = grdUser.PageIndex + 1;
            pageLabel.Text = "Page " + currentPage.ToString() + " of " + grdUser.PageCount.ToString();
        }
    }

另外,ddlPageSize 没有问题,并且工作正常

【问题讨论】:

  • 你得到什么错误??
  • @AnantDabhi:我没有收到错误,当我将选择恢复为默认值时,网格会中断..
  • “gridview 中断”是什么意思?它没有显示任何信息,或者它没有更新,或者标记被破坏,或者什么?
  • @Andrei: break 这里的意思是,见链接。 imagesup.net/?di=13141926054616。当我将选择移动到正常/默认时,它会变成这样
  • @Andrei:这个 ddl &lt;asp:DropDownList ID="ddlPageSize" runat="server" OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged" AutoPostBack="true"&gt; &lt;asp:ListItem Value="2" Text="2" /&gt; &lt;asp:ListItem Value="5" Text="5" /&gt; &lt;asp:ListItem Value="10" Text="10" /&gt; &lt;/asp:DropDownList&gt;。具体值另见listitem

标签: c# asp.net gridview drop-down-menu pagertemplate


【解决方案1】:

在我之前的回答中,我尝试使用 Microsoft GridView 应对技术挑战。

但对于商业应用,我建议使用来自 Telerik、DevExpress、Infragistics、ComponentOne 等供应商的第三方 GridView

因为这些供应商提供的大多数GridViews 都提供了用于分页、自定义页面大小等简单事情的内置功能

基于这个答案,您不会编写任何代码行来担心在运行时自定义页面大小或类似的东西

Check this demo

【讨论】:

  • 我认为,这将是一个很好的实现..你能帮我实现这个吗?
  • 这不仅仅是如何实现的问题,你需要购买一个包,因为它是一个付费的东西,你可以谷歌我提到的名字,谷歌会引导你到他们的网站充满了演示和解释。例如,我在答案中提供的链接详细说明了如何创建演示。然后,一旦您决定去哪个供应商,您就可以购买他们的软件包并有资格获得他们的技术支持
  • 感谢 Gouda:但接受您的回答意味着我的 gridview 正在工作,但仍然没有。还有其他几件事是免费的,我们也得到了支持。这就是为什么我们都在这里。购买永远不会是一种选择。总之谢谢。但是当我自己成功实现这个时,我会标记答案..
【解决方案2】:

问题出在下面部分

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        //...
            for (int i = 0; i < grdUser.PageCount; i++)
            {
                int pageNumber = i + 1;
                ListItem item = new ListItem(pageNumber.ToString());
                if (i == grdUser.PageIndex)
                {
                    item.Selected = true;
                }
                pageList.Items.Add(item);
            }
        //...
    }

当您尝试填充 PageDropDownList 以反映当前网格 PageCount 并选择当前页面时

您可能会想到一种更好的方法来填充该下拉列表而不破坏网格

但我的建议是使用TextBox 代替CurrentPage 而不是DropDownList

为什么?

假设网格有 1000 页,并且用户想要页码 5555。您的方法强制用户在 DropDownList 中从 1 滚动到 5555,这或多或少好像用户一直在页面中导航直到到达他/她的目标页面。

TextBox 将允许最终用户通过输入页面编号来选择页面

它会让您免于填写 DropDownList 的麻烦,并希望能解决您的问题

更新:

使用TextBox,你的代码应该是这样的(但我没有写一个完整的解决方案来测试它)

在 Aspx 中,将 PageDropDownList 控件替换为文本框,如下所示

<asp:TextBox ID="txtPageNumber" AutoPostBack="true" OnTextChanged="txtPageNumber_TextChanged" runat="server" />

在后面的代码中,将 PageDropDownList_SelectedIndexChanged 事件处理程序替换为以下事件处理程序

protected void txtPageNumber_TextChanged(object sender, EventArgs e)
    {
        GridViewRow pagerRow = grdUser.BottomPagerRow;
        TextBox txtPageNumber = (TextBox)sender;
        //Note you need to do more validation on the entered value 
        //Do not allow strings, floats, etc
        int currentPage = int.Parse(txtPageNumber.Text);
        //To handle entries larger than page count        
        if(currentPage >= grdUser.PageCount)
        {
         grdUser.PageIndex = grdUser.PageCount - 1;
         txtPageNumber.Text = grdUser.PageIndex.ToString();             
        }
        else 
          grdUser.PageIndex  = currentPage;

        BindGrid();
    }

最后更新grdUser_DataBound如下

protected void grdUser_DataBound(object sender, EventArgs e)
    {
        //...... your original code here
        //DropDownList pageList = (DropDownList)pagerRow.Cells[0].FindControl("PageDropDownList");
        TextBox txtPageNumber = (TextBox)pagerRow.Cells[0].FindControl("txtPageNumber");
        txtPageNumber.Text = grdUser.PageIndex.ToString();
        //Label pageLabel = (Label)pagerRow.Cells[0].FindControl("CurrentPageLabel");
        // if (pageList != null)
        // {
            // for (int i = 0; i < grdUser.PageCount; i++)
            // {
                // int pageNumber = i + 1;
                // ListItem item = new ListItem(pageNumber.ToString());
                // if (i == grdUser.PageIndex)
                // {
                    // item.Selected = true;
                // }
                // pageList.Items.Add(item);
            // }
        // }
        //...... your original code here
    }

【讨论】:

  • mGouda:根据您的建议,使用文本框。你能给我一个带有代码的简短示例,所以我可以实现和检查。 ?
  • 我已在我的答案中添加了示例代码,希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多