音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

asp.net webform自定义分页控件
日期:2021-09-07 22:24:45   来源:脚本之家

做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件。

翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册。

有图有真相,给个直观的认识:

自定义分页控件前台代码:

<style type="text/css">
 .pager-m-l {
  margin-left: 10px;
 }

 .pager {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 14px;
  color: #333;
  background-color: #fff;
  text-align: center;
  border: 1px solid #eee;
  border-radius: 5px;
  height: 30px;
  line-height: 30px;
  margin: 10px auto;
  width: 650px;
 }

 .font-blue {
  color: #5bc0de;
 }

 .pager a {
  color: #5bc0de;
  text-decoration: none;
 }

  .pager a.gray {
   color: #808080;
  }

 .pager-num {
  width: 30px;
  text-align: center;
 }

 .pager-form-control {
  color: #555;
  background-color: #fff;
  background-image: none;
  border: 1px solid #ccc;
  border-radius: 4px;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
  box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
  padding: 2px 0px;
  margin: 0px 2px;
 }

  .pager-form-control:focus {
   border-color: #66afe9;
   outline: 0;
   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
   box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
  }

 .btn {
  display: inline-block;
  padding: 2px;
  font-weight: normal;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  -ms-touch-action: manipulation;
  touch-action: manipulation;
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 4px;
 }

 .btn-default {
  color: #333;
  background-color: #fff;
  border-color: #ccc;
 }
</style>
<div class="pager">
 <span>当前<asp:Label runat="server" ID="labCurrentPageIndex" CssClass="font-blue"></asp:Label>/<asp:Label runat="server" CssClass="font-blue" ID="labTotalNumberOfPages"></asp:Label>页</span>
 <span class="pager-m-l">共<asp:Label runat="server" CssClass="font-blue" ID="labRecordCount"></asp:Label>条记录</span>
 <span class="pager-m-l">
  <asp:LinkButton runat="server" ID="labFirstPage" OnClick="labFirstPage_Click">首页</asp:LinkButton>
  |
  <asp:LinkButton runat="server" ID="labPreviousPage" OnClick="labPreviousPage_Click">上一页</asp:LinkButton>
  |<asp:LinkButton runat="server" ID="labNextPage" OnClick="labNextPage_Click">下一页</asp:LinkButton>
  |<asp:LinkButton runat="server" ID="labLastPage" OnClick="labLastPage_Click">尾页</asp:LinkButton>
 </span>
 <span class="pager-m-l">跳至<asp:TextBox runat="server" ID="txtPageNum" CssClass="pager-form-control pager-num">1</asp:TextBox>页
  <asp:Button runat="server" Text="GO" ID="btnGo" CssClass="btn btn-default" OnClick="btnGo_Click" /></span>
 <span class="pager-m-l">
  <asp:DropDownList runat="server" ID="ddlPageSize" CssClass="pager-form-control" AutoPostBack="true" OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged">
   <asp:ListItem Text="10" Value="10"></asp:ListItem>
   <asp:ListItem Text="20" Value="20"></asp:ListItem>
   <asp:ListItem Text="30" Value="30"></asp:ListItem>
   <asp:ListItem Text="50" Value="50"></asp:ListItem>
   <asp:ListItem Text="100" Value="100"></asp:ListItem>
  </asp:DropDownList>条/每页</span>
</div>

自定义分页控件后台代码:

private const string viewStateCurrentPageIndex = "CurrentPageIndex";
  private const string viewStateRecordCount = "RecordCount";

  public delegate void PageChangedHandle();
  public event PageChangedHandle OnPageChanged;

  public int PageSize
  {
   get
   {
    return Convert.ToInt32(ddlPageSize.SelectedValue);
   }
  }

  public int CurrentPageIndex
  {
   set
   {
    ViewState[viewStateCurrentPageIndex] = value;
   }
   get
   {
    if (ViewState[viewStateCurrentPageIndex] == null)
    {
     ViewState[viewStateCurrentPageIndex] = 1;
    }

    return Convert.ToInt32(ViewState[viewStateCurrentPageIndex]);
   }
  }
  public int RecordCount
  {
   get
   {
    if (ViewState[viewStateRecordCount] == null)
    {
     ViewState[viewStateRecordCount] = 0;
    }

    return Convert.ToInt32(ViewState[viewStateRecordCount]);
   }
   set
   {
    ViewState[viewStateRecordCount] = value;
   }
  }
  private int TotalNumberOfPages
  {
   get
   {
    return RecordCount % PageSize == 0 ? RecordCount / PageSize : (RecordCount / PageSize) + 1;
   }
  }

  protected void Page_Load(object sender, EventArgs e)
  {
   if (!IsPostBack)
   {

   }
  }

  protected void labFirstPage_Click(object sender, EventArgs e)
  {
   CurrentPageIndex = 1;

   this.DataBind();
  }

  protected void labPreviousPage_Click(object sender, EventArgs e)
  {
   CurrentPageIndex -= 1;

   this.DataBind();
  }

  protected void labNextPage_Click(object sender, EventArgs e)
  {
   CurrentPageIndex += 1;

   this.DataBind();
  }

  protected void labLastPage_Click(object sender, EventArgs e)
  {
   CurrentPageIndex = TotalNumberOfPages;

   this.DataBind();
  }

  protected void btnGo_Click(object sender, EventArgs e)
  {
   int pageNum = 1;
   bool isNum = Int32.TryParse(txtPageNum.Text, out pageNum);
   if (isNum)
   {
    CurrentPageIndex = Math.Min(pageNum, TotalNumberOfPages);
   }

   this.DataBind();
  }

  protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
  {
   CurrentPageIndex = 1;

   this.DataBind();
  }

  protected override void DataBind(bool raiseOnDataBinding)
  {
   BindPager();
   base.DataBind(raiseOnDataBinding);

   if (OnPageChanged != null)
   {
    OnPageChanged();
   }
  }

  private void BindPager()
  {
   labCurrentPageIndex.Text = CurrentPageIndex.ToString();
   labTotalNumberOfPages.Text = TotalNumberOfPages.ToString();
   labRecordCount.Text = RecordCount.ToString();

   SetNavigateEnabled();
  }  

  private void SetNavigateEnabled()
  {
   txtPageNum.Text = CurrentPageIndex.ToString();
   labFirstPage.Enabled = true;
   labPreviousPage.Enabled = true;
   labNextPage.Enabled = true;
   labLastPage.Enabled = true;

   labFirstPage.CssClass = "font-blue";
   labPreviousPage.CssClass = "font-blue";
   labNextPage.CssClass = "font-blue";
   labLastPage.CssClass = "font-blue";

   if (CurrentPageIndex == 1)
   {
    labFirstPage.Enabled = false;
    labPreviousPage.Enabled = false;

    labFirstPage.CssClass = "gray";
    labPreviousPage.CssClass = "gray";
   }
   if (CurrentPageIndex == TotalNumberOfPages)
   {
    labNextPage.Enabled = false;
    labLastPage.Enabled = false;

    labNextPage.CssClass = "gray";
    labLastPage.CssClass = "gray";
   }
   if (RecordCount == 0)
   {
    labFirstPage.Enabled = false;
    labPreviousPage.Enabled = false;

    labFirstPage.CssClass = "gray";
    labPreviousPage.CssClass = "gray";

    labNextPage.Enabled = false;
    labLastPage.Enabled = false;

    labNextPage.CssClass = "gray";
    labLastPage.CssClass = "gray";
   }
  }

当前页码、总共多少条记录使用ViewState记录状态信息,因为导航控件会引起回发刷新。
分页后的数据加载,使用事件。

事件的具体实现放在使用分页控件的具体页面中,进行事件的注册。

测试分页控件的前台页面:

<div style="margin-bottom:10px;">
  text:
  <asp:TextBox ID="txtContent" runat="server"></asp:TextBox>
  <asp:Button ID="btnQuery" runat="server" Text="查 询" OnClick="btnQuery_Click"/>
 </div>
 <div>
  <asp:GridView ID="gvList" runat="server" Width="99%" AutoGenerateColumns="true"></asp:GridView>
  <uc1:PagerControl runat="server" ID="Pager" />
</div>

测试分页控件的后台代码:

 private const string dtSourceViewStateKey = "dtSourceViewStateKey";

 protected void Page_Load(object sender, EventArgs e)
 {
  if (!IsPostBack)
  {
  BindData(true);

  }
  Pager.OnPageChanged += OnPageChanged;
 }

 private void BindData(bool bindRecordCount)
 {
  DataTable dtSource = GetDataSource();
  

  var source = dtSource.AsEnumerable();
  if (!string.IsNullOrEmpty(txtContent.Text.Trim()))
  {
  source = source.Where(w => w.Field<string>("text").Contains(txtContent.Text.Trim()));
  }

  if (bindRecordCount)
  {
  Pager.RecordCount = source.Count();
  Pager.CurrentPageIndex = 1;
  Pager.DataBind();
  }

  gvList.DataSource = source
  .Skip((Pager.CurrentPageIndex - 1) * Pager.PageSize)
  .Take(Pager.PageSize)
  .Select(r => new { id = r["id"].ToString(), text = r["text"].ToString() })
  .ToList();
  gvList.DataBind();
 }

 private void OnPageChanged()
 {
  BindData(false);
 }

 private DataTable InitDataTable()
 {
  DataTable dtSource = new DataTable();
  DataColumn id = new DataColumn("id");
  id.AutoIncrement = true;
  id.AutoIncrementSeed = 1;

  dtSource.Columns.Add(id);
  dtSource.Columns.Add("text");

  for (int i = 1; i <= 1000; i++)
  {
  DataRow dr = dtSource.NewRow();
  dr["text"] = "内容" + i;

  dtSource.Rows.Add(dr);
  }

  return dtSource;
 }

 private DataTable GetDataSource()
 {
  if (ViewState[dtSourceViewStateKey] == null)
  {
  ViewState[dtSourceViewStateKey] = InitDataTable();
  }

  return ViewState[dtSourceViewStateKey] as DataTable;
 }

 protected void btnQuery_Click(object sender, EventArgs e)
 {
  BindData(true);
 }

在Page_Load中注册翻页后的事件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程