首页 > 技术文章 > C#自定义用户控件之分页

liuqichun 2015-05-13 11:20 原文

形形色色的分页控件很多,有些可满足我们的要求,但有些却不一定,下面是我在工作当中遇到的问题而随手写了个能满足某些功能的自定义分页控件;

控件源代码:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WUCPaging.ascx.cs" Inherits="DWTWPS.CommonHelper.UserControls.WUCPaging" %>
<link rel="stylesheet" type="text/css" href="../css/select2css.css" />

<asp:Label ID="lblCurrentPage" runat="server" CssClass="lblPageClass"></asp:Label>

<asp:LinkButton ID="lnkFirst" runat="server" OnClick="lnk_Click" CommandName="First">首页</asp:LinkButton>
<asp:LinkButton ID="lnkPrev" runat="server" OnClick="lnk_Click" CommandName="Prev">上一页</asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" OnClick="lnk_Click" CommandName="Next">下一页</asp:LinkButton>
<asp:LinkButton ID="lnkEnd" runat="server" OnClick="lnk_Click" CommandName="End">尾页</asp:LinkButton>
转到至<asp:TextBox ID="txtGoPage" runat="server" Width="30px"></asp:TextBox><asp:Label ID="lblTotalPage" runat="server"></asp:Label><asp:Button ID="lnkGo" runat="server" OnClick="lnk_Click" CommandName="Go" Text="确定"></asp:Button>
每页
<asp:DropDownList ID="ddlCount" runat="server" OnSelectedIndexChanged="ddlCount_SelectedIndexChanged" AutoPostBack="True">
    <asp:ListItem Value="5">5</asp:ListItem>
    <asp:ListItem Value="10" Selected="True">10</asp:ListItem>
    <asp:ListItem Value="15">15</asp:ListItem>
    <asp:ListItem Value="20">20</asp:ListItem>
    <asp:ListItem Value="50">50</asp:ListItem>
    <asp:ListItem Value="100">100</asp:ListItem>
</asp:DropDownList>条

控件后台.cs代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DWTWPS.CommonHelper.UserControls
{
    public partial class WUCPaging : System.Web.UI.UserControl
    {
        private Repeater _rp;
        private readonly PagedDataSource PDS = new PagedDataSource();

        public enum MyPageSize
        {
            Size5 = 5,
            Size10 = 10,
            Size20 = 20,
            Size30 = 30,
            Size50 = 50,
            Size100 = 100
        }

        private string _controlId = "Repeater";

        [Bindable(true), DefaultValue("Repeater"), Description("所要绑定的数据源ID。")]
        public string ControlId
        {
            get { return _controlId; }
            set { _controlId = value; }
        }

        [Bindable(true), DefaultValue(10), Description("分页控件大小。")]
        public MyPageSize PageSize
        {
            get { return Convert.ToInt16(ViewState["PageSize"]) == 0 ? MyPageSize.Size10 : (MyPageSize)Enum.Parse(typeof(MyPageSize), ViewState["PageSize"].ToString()); }
            set { ViewState["PageSize"] = value; }
        }

        [Bindable(true), DefaultValue(true), Description("是否允许分页控件分页。")]
        public bool AllowPaging
        {
            get { return PDS.AllowPaging; }
            set { PDS.AllowPaging = value; }
        }

        [Bindable(true), Description("提供数据源的数据。")]
        public object DataSource
        {
            get { return PDS.DataSource; }
            set { PDS.DataSource = value == null ? null : ((DataTable)value).DefaultView; }
        }

        [Category("行为"), Browsable(true), Description("页索引和页大小变化之后激发。")]
        public event EventHandler PageChanged;

        /// <summary>
        /// 数据源记录总数
        /// </summary>
        private int DataSourceCount
        {
            get
            {
                if (PDS.DataSource != null && PDS.DataSourceCount > 0)
                    return PDS.DataSourceCount;
                return 0;
            }
        }

        /// <summary>
        /// 页总数
        /// </summary>
        public int PageCount
        {
            get
            {
                if (DataSourceCount == 0)
                    return 1;
                if (DataSourceCount % PDS.PageSize == 0)
                    return DataSourceCount / PDS.PageSize;
                return DataSourceCount / PDS.PageSize + 1;
            }
        }

        /// <summary>
        /// 页索引
        /// </summary>
        public int PageIndex
        {
            get
            {
                return (ViewState["PageIndex"] == null || Convert.ToInt16(ViewState["PageIndex"]) == 0)
                           ? 0
                           : Convert.ToInt16(ViewState["PageIndex"]);
            }
            set { ViewState["PageIndex"] = value; }
        }

        /// <summary>
        /// 页大小
        /// </summary>
        public int PageSizeInt 
        {
            get
            {
                return Convert.ToInt16(ViewState["PageSize"]) == 0
                           ? 10
                           : Convert.ToInt16(ViewState["PageSize"]);
            }
        }

        public int CurrentPageIndex
        {
            get { return PDS.CurrentPageIndex; }
            set { PDS.CurrentPageIndex = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                ControlDataHandler();
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            Control c = Parent;
            _rp = c.FindControl(_controlId) as Repeater;

            while (c != null && _rp == null)
            {
                _rp = c.FindControl(_controlId) as Repeater;
                c = c.Parent;
            }
        }

        public override void DataBind()
        {
            //base.DataBind();
            ControlDataHandler();
        }

        private void ControlDataHandler()
        {
            PDS.PageSize = Convert.ToInt16(PageSize);
            ddlCount.SelectedValue = Convert.ToInt16(PageSize).ToString(CultureInfo.InvariantCulture);

            //20140512-lqc-Eidt:为了与公司控件尽量一致化
            lblCurrentPage.Text = "共有" + DataSourceCount.ToString() + "条记录 当前页:" + (PDS.CurrentPageIndex + 1).ToString() + "/" + PageCount;
            //lblCurrentPage.Text = "共有" + DataSourceCount.ToString(CultureInfo.InvariantCulture) + "条数据 共" + PageCount + "页";

            lnkPrev.Enabled = true;
            //上一页:当前页-1<0时,总页数为1时
            if (PageCount == 1 || (PDS.CurrentPageIndex - 1) < 0)
                lnkPrev.Enabled = false;
            lnkNext.Enabled = true;
            //下一页:当前页+1>=总页数时,总页数为1时
            if (PageCount == 1 || (PDS.CurrentPageIndex + 1) >= PageCount)
                lnkNext.Enabled = false;

            RepeaterDataBind();
        }

        private void RepeaterDataBind()
        {
            if (DataSource != null)
                _rp.DataSource = PDS;
            else
                _rp.DataSource = DataSource;
            _rp.DataBind();
        }

        protected void ddlCount_SelectedIndexChanged(object sender, EventArgs e)
        {
            ViewState["PageSize"] = Convert.ToInt16(ddlCount.SelectedValue);
            if (PageChanged != null)
                PageChanged(sender, e);
            else
                ControlDataHandler();
        }

        protected void lnk_Click(object sender, EventArgs e)
        {
            if (PageChanged != null)
            {
                PageChanged(sender, e);

                string commandName = string.Empty;
                var c = (Control) sender;
                if (c is Button)
                    commandName = (c as Button).CommandName;
                if (c is LinkButton)
                    commandName = (c as LinkButton).CommandName;

                //commandName = ((Button)sender).CommandName;
                switch (commandName)
                {
                    case "First":
                        {
                            PDS.CurrentPageIndex = 0;
                            break;
                        }
                    case "Prev":
                        {
                            PDS.CurrentPageIndex = PageIndex - 1;
                            if (PDS.CurrentPageIndex <= 0)
                                PDS.CurrentPageIndex = 0;
                            break;
                        }
                    case "Next":
                        {
                            PDS.CurrentPageIndex = PageIndex + 1;
                            if (PDS.CurrentPageIndex >= (PageCount - 1))
                                PDS.CurrentPageIndex = PageCount - 1;
                            break;
                        }
                    case "End":
                        {
                            PDS.CurrentPageIndex = PageCount - 1;
                            break;
                        }
                    case "Go":
                        {
                            Regex reg = new Regex("^\\d+$");
                            if (!string.IsNullOrEmpty(txtGoPage.Text) && reg.IsMatch(txtGoPage.Text) &&
                                Convert.ToInt16(txtGoPage.Text) > 0 && Convert.ToInt16(txtGoPage.Text) <= PageCount)
                                PDS.CurrentPageIndex = Convert.ToInt16(txtGoPage.Text) - 1;
                            else
                            {
                                ScriptManager.RegisterStartupScript(this, this.GetType(),
                                                DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture),
                                                "<script>alert('页索引超出范围');</script>", false);
                                PDS.CurrentPageIndex = PageCount - 1;
                                txtGoPage.Text = PageCount.ToString();
                            }
                            break;
                        }
                }
                PageIndex = PDS.CurrentPageIndex;

                txtGoPage.Text = (PDS.CurrentPageIndex + 1).ToString();
            }
            ControlDataHandler();
        }
    }
}

到此,我们即完成了自定义控件的开发,下面我们来看看怎么使用的;
html中控件的引入:

<%@ Register Src="~/CommonHelper/UserControls/WUCPaging.ascx" TagPrefix="uc1" TagName="WUCPaging" %>

 <div class="tb_container"   style="padding-top:4px;">
                <div class="tb_sub_container">
                    <div class="ui-jqgrid-hbox">
                         <table  class="table_1" id="tb_1">
                                <thead>
                                    <tr>
                                        <th width="6%"><input id="chkAll" name="chkAll" runat="server" type="checkbox" onclick="Check(this, 'chkItem')" title="全选" /></th>
                                        <th width="6%">编号</th>
                                        <th width="6%">地区</th>
                                        <th width="10%">材料名称</th>
                                        <th width="8%">材料编号</th>
                                        <th width="7%">品牌</th>
                                        <th width="5%">单位</th>
                                        <th width="6%">规格</th>
                                        <th width="6%">重量</th>
                                        <th width="6%">所属材料</th>
                                        <%--<th width="6%">原供价</th>
                                        <th width="6%">现供价</th>--%>
                                        <th width="6%">原配送</th>
                                        <th width="6%">现配送</th>
                                        <th width="7%">材料商</th>
                                        <%--<th width="6%">执行时间</th>--%>
                                        <th class="last">操作</th>
                                    </tr>
                                </thead>
                        </table>
                    </div>
                    <div class="ui-jqgrid-bdiv" style="overflow:auto;">
                        <table class="table_1 notop  noright noleft" id="tb_2">    
                            <tbody>
                                <asp:Repeater ID="Repeater" runat="server">
                                    <ItemTemplate>
                                        <tr>
                                            <td width="6%">
                                                <asp:CheckBox ID="chkItem" runat="server" /></td>
                                            <td width="6%"><%#Container.ItemIndex+1 %>
                                                <asp:Label ID="lblMatAdjId" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_Adj_Id")%>' runat="server" Visible="false"></asp:Label>
                                                <input type="hidden" id="hidMatAdjId" value='<%# DataBinder.Eval(Container.DataItem, "Mat_Adj_Id")%>' runat="server" />
                                                <asp:Label ID="lblGuidId" Text='<%# DataBinder.Eval(Container.DataItem, "GuidID")%>' runat="server" Visible="false"></asp:Label>
                                                <input type="hidden" id="hidReason" value='<%# DataBinder.Eval(Container.DataItem, "Mat_Adj_Reason")%>' runat="server" />
                                                <asp:Label ID="lblID" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_Id")%>' runat="server" Visible="False"></asp:Label>
                                            </td>
                                            <td width="6%"><asp:Label ID="lblDQ" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_DQ_Name")%>' runat="server"></asp:Label></td>
                                            <td width="10%"><%# FuncDataFormat.ZH_strChaochang(Eval("Mat_Name"),6) %></td>
                                            <td width="8%"><%# FuncPublic.ZH_ASCMM_LENGTH((string) DataBinder.Eval(Container.DataItem, "Mat_Number"))%></td>
                                            <td width="7%"><asp:Label ID="lblNum" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_PinPai_Title")%>' runat="server"></asp:Label></td>
                                            <td width="5%"><asp:Label ID="lblDW" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_DanWei_Title")%>' runat="server"></asp:Label></td>
                                            <td width="6%"><asp:Label ID="lblGuiGe" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_GuiGe")%>' runat="server"></asp:Label></td>
                                            <td width="6%"><asp:Label ID="lblGHJ" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_Weight")%>' runat="server"></asp:Label></td>
                                            <td width="6%"><asp:Label ID="lblZL" Text='<%# DataBinder.Eval(Container.DataItem, "CLT_Name")%>' runat="server"></asp:Label></td>
                                            <%--<td><asp:Label ID="lblghY" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_SupplyPrice_YW")%>' runat="server"></asp:Label></td>
                                            <td><asp:Label ID="lblghX" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_SupplyPrice")%>' runat="server"></asp:Label></td>--%>
                                            <td width="6%"><asp:Label ID="lblpsY" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_ChengBenYW")%>' runat="server"></asp:Label></td>
                                            <td width="6%"><asp:Label ID="lblpsX" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_ChengBen")%>' runat="server"></asp:Label></td>
                                            <td width="7%"><%# GetSupplierNameByMatId(Eval("Mat_Id").ToString(),false) %>
                                                <%--<asp:Label ID="lblGHS" Text='<%# DataBinder.Eval(Container.DataItem, "Mat_Supplier_Name")%>' runat="server"></asp:Label>--%>
                                            </td>
                                            <%--<td><asp:Label ID="lblTime" Text='<%# Convert.ToDateTime(Eval("Mat_Adj_AduTime")).ToString("yyyy-MM-dd")%>' runat="server"></asp:Label></td>--%>
                                            <td>
                                                <a class="tooltip_1" data-msg="查看"><asp:ImageButton runat="server" ID="lnkbtnSel" ImageUrl="../images/selectBtn.png" OnClick="imgbtn_Click" /></a>
                                                <%--<a id="aNote" runat="server" class="SearchB"><img src="../images/enable.png" title="调价记录" /></a>|--%>
                                                <a class="tooltip_1" data-msg="调价记录"><asp:ImageButton runat="server" ID="lnkbtnNotes" ImageUrl="../images/tjls.png" OnClick="imgbtn_Click" /></a>
                                                <a><%--<asp:ImageButton runat="server" ID="lnkbtnPass" ImageUrl="../images/selectBtn.jpg" OnClick="imgbtn_Click" ToolTip="通过" OnClientClick="return confirm('确定审核通过?');" />--%></a>
                                                <a id="aPass" runat="server" class="Search2B tooltip_1" data-msg="通过"><img src="../images/pass.png" /></a>
                                                <a id="aBack" runat="server" class="SearchB tooltip_1" data-msg="打回"><img src="../images/back.png" /></a>
                                            </td>
                                        </tr>
                                    </ItemTemplate>
                                    <FooterTemplate>
                                            <asp:Label ID="lblEmpty" Text="No Result" runat="server" Visible='<%#bool.Parse((Repeater.Items.Count==0).ToString())%>' CssClass="noResult">
                                            </asp:Label>
                                    </FooterTemplate>
                                </asp:Repeater>
                             </tbody>
                        </table> 
                    </div>              
                </div>
            </div>
             <div  class="page_2">
                    <uc1:WUCPaging runat="server" ID="WUCPaging" ControlId="Repeater" AllowPaging="True" OnPageChanged="WUCPaging_PageChanged" PageSize="Size10" />
             </div>

页面.cs代码:

        protected void WUCPaging_PageChanged(object sender, EventArgs e)
        {
            BindData();
        }
 private void BindData()
        {
            string filter = " WHERE bcc.mat_jincheng = 0 and ma.Mat_Adj_JinCheng = 0 and ma.Mat_Adj_State = 1";
            if (!string.IsNullOrEmpty(CurrentRoleDqId) && CurrentRoleDqId != HeadOfficeDqId)
                //filter += " AND (bcc.Mat_DiQu =" + CurrentRoleDqId + " OR bcc.Mat_DiQu=" + CountryDqId + ")";//20140605-lqc-Edit:地方能看到全国的材料
                filter += " AND (bcc.Mat_DiQu =" + CurrentRoleDqId + " ) ";//20140605-lqc-Edit:地方能看到全国的材料//OR CHARINDEX('|71|',bcc.Mat_Number,15)>0
            
            if (ddlKeMu1.SelectedValue != "0" && !string.IsNullOrEmpty(ddlKeMu1.SelectedValue))
                filter += " AND bc.CLT_Subjection =" + ddlKeMu1.SelectedValue;
            if (ddlKeMu2.SelectedValue != "0" && !string.IsNullOrEmpty(ddlKeMu2.SelectedValue))
                filter += " AND bc.CLT_Id =" + ddlKeMu2.SelectedValue;
            if (ddlFenLei.SelectedValue != "0" && !string.IsNullOrEmpty(ddlFenLei.SelectedValue))
                filter += " AND mac.Mat_Type IN ('" + ddlFenLei.SelectedValue + "')";
            if (ddlPinPai.SelectedValue != "0" && !string.IsNullOrEmpty(ddlPinPai.SelectedValue))
                filter += " AND mac.Mat_PinPai_ID IN ('" + ddlPinPai.SelectedValue + "')";
            if (ddlDiQu.SelectedValue != "0" && !string.IsNullOrEmpty(ddlDiQu.SelectedValue) && ddlDiQu.SelectedValue != CountryDqId)
                filter += " AND bcc.Mat_DiQu IN ('" + ddlDiQu.SelectedValue + "')";
            //else if (ddlDiQu.SelectedValue == CountryDqId)
            //    filter += " AND CHARINDEX('|71|',bcc.Mat_Number,15)>0 ";
            if (ddlGuiGe.SelectedValue != "0" && !string.IsNullOrEmpty(ddlGuiGe.SelectedValue))
                filter += " AND mac.Mat_GuiGe_ID IN ('" + ddlGuiGe.SelectedValue + "')";

            string txtSeek = txtSeekContent.Value.Trim();
            if (!string.IsNullOrEmpty(txtSeek))
            {
                DateTime dtime;
                if (DateTime.TryParse(txtSeek, out dtime))
                {
                    filter += " AND (DATEDIFF(d,bcc.CreationDate,'" + dtime + "')=0)";
                }
                else
                {
                    filter += " AND (bcc.Mat_Name LIKE '%" + txtSeek + "%' OR bcc.Mat_PinPai  LIKE '%" +
                          txtSeek + "%' ";
                    if (!string.IsNullOrEmpty(FuncPublic.ZH_StrTASC(txtSeek)))
                        filter += "OR bcc.Mat_Number like '%" + FuncPublic.ZH_StrTASC(txtSeek) + "%' ";
                    filter += " OR bcc.Mat_GuiGe LIKE '%" + txtSeek + "%')";
                }
            }
            
            string QueryStr = @"
SELECT GuidID,bcc.Mat_Id,mac.Mat_Attach_ID,Mat_DiQu,Mat_DQ_Name,Mat_Name,bcc.Mat_Number,
Mat_DanWei,Mat_GuiGe,mp.Mat_PinPai_ID,mp.Mat_PinPai_Title,ma.Mat_Adj_AduTime,ma.Mat_Adj_id,
ma.Mat_ChengBenYW,ma.Mat_ChengBen,ma.Mat_SupplyPrice_YW,ma.Mat_SupplyPrice,ma.Mat_Adj_Reason,
Mat_Weight,Mat_Supplier_ID,Mat_Supplier_ComName,Mat_Supplier_Name,Mat_DanWei_ID,ma.Mat_AuditOrder,
Mat_DanWei_Title,mac.Mat_AduState,mac.Mat_State,bcc.CLT_Id,CLT_Subjection,CLT_Name
from mat_adj ma 
left join bj_cailiao bcc on ma.mat_id = bcc.mat_id
left join mat_attach mac on bcc.Mat_Id = mac.Mat_Id
left join (select Mat_Supplier_ID,Mat_Supplier_ComName,Mat_Supplier_Name from Mat_Supplier) ms 
on ms.Mat_Supplier_ID = mac.Mat_SupplierID
left join Mat_DanWei md ON md.Mat_DanWei_ID = bcc.Mat_DanWei
left join Mat_DQ mdq on mdq.Mat_DQ_ID = bcc.Mat_DiQu
left join BJ_CLTree bc on bcc.CLT_Id = bc.CLT_Id
left join Mat_PinPai mp on mp.Mat_PinPai_ID = mac.Mat_PinPai_ID
" + filter + " ORDER BY ma.Mat_Adj_CreateTime DESC ";

            DataTable temp = bj_CaiLiao.GetBJCaiLiao(QueryStr);

            if (!TableIsNullOrEmpty(temp))
            {

                DataTable tbl = temp.Clone();

                foreach (DataRow dataRow in temp.Rows)
                {
                    string hasAuditOrder = dataRow["Mat_AuditOrder"].ToString();
                    string notAuditOrder = string.IsNullOrEmpty(hasAuditOrder)
                                               ? MatAdjustAuditOrders
                                               : MatAdjustAuditOrders.Replace(hasAuditOrder, "");
                    string notFirstAuditOrder = string.Empty;
                    if (notAuditOrder == MatAdjustAuditOrders && notAuditOrder.Length > 0)
                        notFirstAuditOrder = notAuditOrder.Split(',')[0];
                    else if (notAuditOrder.Length > 1)
                        notFirstAuditOrder = notAuditOrder.Split(',')[1];
                    if (notFirstAuditOrder == CurrentRoleId)
                    {
                        tbl.ImportRow(dataRow);
                    }
                }
                WUCPaging.DataSource = tbl;
            }
            else
                WUCPaging.DataSource = temp;

            WUCPaging.DataBind();
        }

 

推荐阅读