灵活使用asp.net中的gridview控件

gridview是asp.net常用的显示数据控件,对于.net开发人员来说应该是非常的熟悉了。gridview自带有许多功能,包括分页,排序等等,但是作为一个.net开发人员来说熟练掌握利用存储过程分页或者第三方自定义分页十分重要,这不仅是项目的需要,也是我们经验能力的提示,下面我就来讲利用存储过程分页实现绑定gridview

1、执行存储过程

网上有许多sql分页存储过程的例子,但是你会发现其中有许多一部分是不能用的,例如有些使用in或者not in来分页效率非常的低,有些sp可以分页但是扩展型非常差,有些效率也比较高,但是不能返回查询记录总数,

例如下面的这个分页,尽管比较简单,但是用not in来分页效率比较低,且查询表已经固定死了,无法扩展,其实是个失败的分页

CREATE PROCEDURE GetProductsByPage
@PageNumber int,
@PageSize int
AS
declare @sql nvarchar(4000)
set @sql = 'select top ' + Convert(varchar, @PageSize) + ' * from test where id not in (select top ' + Convert(varchar, (@PageNumber - 1) * @PageSize) + ' id from test)'
exec sp_executesql @sql
GO

 综上我觉得这个分页总体上来说比较好的效率也非常的高且分页只需要执行一次sp,分页支持多表多标间查询

ALTER PROCEDURE [dbo].[Proc_SqlPageByRownumber]
 (
  @tbName VARCHAR(255),   --表名
  @tbGetFields VARCHAR(1000)= '*',--返回字段
  @OrderfldName VARCHAR(255),  --排序的字段名
  @PageSize INT=20,    --页尺寸
  @PageIndex INT=1,    --页码
  @OrderType bit = 0,    --0升序,非0降序
  @strWhere VARCHAR(1000)='',  --查询条件
  @TotalCount INT OUTPUT   --返回总记录数
 )
 AS
 -- =============================================
 -- Author:  allen (liyuxin)
 -- Create date: 2012-03-30
 -- Description: 分页存储过程(支持多表连接查询)
 -- Modify [1]: 2012-03-30
 -- =============================================
 BEGIN
  DECLARE @strSql VARCHAR(5000) --主语句
  DECLARE @strSqlCount NVARCHAR(500)--查询记录总数主语句
  DECLARE @strOrder VARCHAR(300) -- 排序类型

  --------------总记录数---------------
  IF ISNULL(@strWhere,'') <>''
   SET @strSqlCount='Select @TotalCout=count(*) from ' + @tbName + ' where 1=1 '+ @strWhere
  ELSE SET @strSqlCount='Select @TotalCout=count(*) from ' + @tbName

  exec sp_executesql @strSqlCount,N'@TotalCout int output',@TotalCount output
  --------------分页------------
  IF @PageIndex <= 0 SET @PageIndex = 1

  IF(@OrderType<>0) SET @strOrder=' ORDER BY '+@OrderfldName+' DESC '
  ELSE SET @strOrder=' ORDER BY '+@OrderfldName+' ASC '

  SET @strSql='SELECT * FROM
  (SELECT ROW_NUMBER() OVER('+@strOrder+') RowNo,'+ @tbGetFields+' FROM ' + @tbName + ' WHERE 1=1 ' + @strWhere+' ) tb
  WHERE tb.RowNo BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND ' +str(@PageIndex*@PageSize)

  exec(@strSql)
  SELECT @TotalCount
 END

2  、封装c#调用语句

我们总是习惯上对代码进行封装,这样可以提高代码的阅读效率,维护起来也更加方便,养成良好的封装代码习惯,我们就从初级步入了中级,其实这只是个习惯而已

public static class PageHelper
 {
  /// <summary>
  /// 分页数据
  /// </summary>
  /// <param name="TableName">表明</param>
  /// <param name="RetureFields">返回字段</param>
  /// <param name="strWhere">条件</param>
  /// <param name="PageSize">每页记录数</param>
  /// <param name="CurPage">当前页数</param>
  /// <param name="RowCount">总记录数</param>
  /// <param name="sortField">排序字段</param>
  /// <returns></returns>
 public static DataTable GetPageList(string tbName, string tbGetFields, string OrderFldName, int PageSize, int PageIndex, int OrderType, string strWhere, out int TotalCount)
  {
   SqlCommand cmd = new SqlCommand("Proc_SqlPageByRownumber");//存储过程名称
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.AddWithValue("@tbName", tbName);//表名称
   cmd.Parameters.AddWithValue("@tbGetFields", tbGetFields);//要显示的字段名(不要加Select)
   cmd.Parameters.AddWithValue("@OrderfldName", OrderFldName);//排序索引字段名
   cmd.Parameters.AddWithValue("@PageIndex", PageIndex);//当前第几页,页码
   cmd.Parameters.AddWithValue("@PageSize", PageSize);//每页显示的数据条数
   cmd.Parameters.AddWithValue("@OrderType", OrderType);//设置排序类型,非0值则降序
   cmd.Parameters.AddWithValue("@strWhere", strWhere);//查询条件,不要加where
   cmd.Parameters.Add(new SqlParameter("@TotalCount", SqlDbType.Int));
   cmd.Parameters["@TotalCount"].Direction = ParameterDirection.Output;
   DataTable dt = RunProcedureCmd(cmd);
   TotalCount = Convert.ToInt32(cmd.Parameters["@TotalCount"].Value.ToString());//返回的总页数
   return dt;
  }

  /// <summary>
  /// 执行存储过程,返回DataTable
  /// </summary>
  /// <param name="cmd"></param>
  /// <returns></returns>
  public static DataTable RunProcedureCmd(SqlCommand cmd)
  {
   DataTable result = new DataTable();
   string connectionString = ConfigurationManager.AppSettings["CONNSTRING"].ToString();
   SqlConnection conn = new SqlConnection(connectionString);//你自己的链接字符串
   try
   {
    if ((conn.State == ConnectionState.Closed))
    {
     conn.Open();
    }
    cmd.Connection = conn;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(result);
    da.Dispose();
    conn.Close();
    conn.Dispose();

    return result;
   }
   catch (Exception ex)
   {
    conn.Close();
    conn.Dispose();
    throw ex;
   }
  }
 }

3、 gridview利用第三方插件实现分页

分页现在比较流行的插件是aspnetpager,这是一个比较成熟的插件,网上也有许多的例子。

1 )、下载aspnetpager插件,然后右键引用。

2 )、 打开工具箱,在选项卡上右键选择项导入插件

3 )、拖控件到页面,设置控件的属性

后台代码

protected void Page_Load(object sender, EventArgs e)
  {
   if (!IsPostBack)
   {
    GridViewBind("");
   }
  }

  private void GridViewBind(string sqlWhere)
  {
   int TotalCount;
   DataTable dt = bll.GetList("stu_score", "code,name,beginTime,endTime,score", "id", this.AspNetPager1.PageSize, this.AspNetPager1.CurrentPageIndex, 1,sqlWhere, out TotalCount);
   this.AspNetPager1.RecordCount = TotalCount;
   this.GridView1.DataSource = dt;
   this.GridView1.DataBind();
   this.AspNetPager1.CustomInfoHTML = string.Format("当前第{0}/{1}页 共{2}条记录 每页{3}条", new object[] { this.AspNetPager1.CurrentPageIndex, this.AspNetPager1.PageCount, this.AspNetPager1.RecordCount, this.AspNetPager1.PageSize });
  }

  
//GridView高亮行显示
  protectedvoid GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
   {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
      e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor,this.style.backgroundColor='#C7DEF3'");
     e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
    }
   }

前台代码

<table width="100%">
 <tr>
  <td style="width: 60%; float: left;">
   beginTime:<asp:TextBox ID="txtBeginTime" runat="server"></asp:TextBox>
   endTime:<asp:TextBox ID="txtEndTime" name="mydate" runat="server"></asp:TextBox>
  </td>
  <td style="width: 30%; float: right;">
   <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click"
    class="ui-button ui-widget ui-state-default ui-corner-all"></asp:Button>
   <asp:Button ID="btnAdd" runat="server" Text="Create" OnClientClick="javascript:return false;" />
  </td>
 </tr>
 <tr>
  <td colspan="2" style="width: 100%; float: left;">
   <asp:GridView ID="GridView1" runat="server" Width="100%" CellPadding="2" CssClass="GridViewStyle"
    CellSpacing="2" AutoGenerateColumns="False">
    <Columns>
     <asp:BoundField DataField="name" HeaderText="name" />
     <asp:BoundField DataField="code" HeaderText="code" />
     <asp:BoundField DataField="beginTime" HeaderText="beginTime" />
     <asp:BoundField DataField="endTime" HeaderText="endTime" />
     <asp:BoundField DataField="score" HeaderText="score" />
    </Columns>
    <FooterStyle CssClass="GridViewFooterStyle" />
    <RowStyle CssClass="GridViewRowStyle" />
    <SelectedRowStyle CssClass="GridViewSelectedRowStyle" />
    <PagerStyle CssClass="GridViewPagerStyle" />
    <AlternatingRowStyle CssClass="GridViewAlternatingRowStyle" />
    <HeaderStyle CssClass="GridViewHeaderStyle" />
   </asp:GridView>
  </td>
 </tr>
 <tr>
  <td colspan="2">
   <webdiyer:AspNetPager ID="AspNetPager1" runat="server" CssClass="paginator" CurrentPageButtonClass="cpb"
    OnPageChanged="AspNetPager1_PageChanged" PageSize="5" FirstPageText="首页" LastPageText="尾页"
    NextPageText="下一页" PrevPageText="上一页" CustomInfoHTML="共%RecordCount%条,第%CurrentPageIndex%页 /共%PageCount% 页"
    CustomInfoSectionWidth="30%" ShowCustomInfoSection="Right">
   </webdiyer:AspNetPager>
  </td>
 </tr>
</table>

4 、当然你可以对你的gridview进行样式调整,新建gridviewSY.css

.GridViewStyle
{
 border-right: 2px solid #A7A6AA;
 border-bottom: 2px solid #A7A6AA;
 border-left: 2px solid white;
 border-top: 2px solid white;
 padding: 4px;
}
.GridViewStyle a
{
 color: #FFFFFF;
}

.GridViewHeaderStyle th
{
 border-left: 1px solid #EBE9ED;
 border-right: 1px solid #EBE9ED;
}

.GridViewHeaderStyle
{
 background-color: #5D7B9D;
 font-weight: bold;
 color: White;
}

.GridViewFooterStyle
{
 background-color: #5D7B9D;
 font-weight: bold;
 color: White;
}

.GridViewRowStyle
{
 background-color: #F7F6F3;
 color: #333333;
}

.GridViewAlternatingRowStyle
{
 background-color: #FFFFFF;
 color: #284775;
}

.GridViewRowStyle td, .GridViewAlternatingRowStyle td
{
 border: 1px solid #EBE9ED;
}

.GridViewSelectedRowStyle
{
 background-color: #E2DED6;
 font-weight: bold;
 color: #333333;
}

.GridViewPagerStyle
{
 background-color: #284775;
 color: #FFFFFF;
}

.GridViewPagerStyle table /* to center the paging links*/
{
 margin: 0 auto 0 auto;
分页控件也添加样式,当然gridview样式和分页样式在同一个css中了

.paginator { font: 11px Arial, Helvetica, sans-serif;padding:10px 20px

10px 0; margin: 0px;}
.paginator a {padding: 1px 6px; border: solid 1px #ddd; background:

#fff; text-decoration: none;margin-right:2px}
.paginator a:visited {padding: 1px 6px; border: solid 1px #ddd;

background: #fff; text-decoration: none;}
.paginator .cpb {padding: 1px 6px;font-weight: bold; font-size:

13px;border:none}
.paginator a:hover {color: #fff; background: #ffa501;border-

color:#ffa501;text-decoration: none;}

页面最总结果显示样式,

 

接下来我们给时间添加样式,给时间添加样式普遍选择的是datePicker插件,导入控件所用的js和css

<script src="jquery-ui-1.9.2.custom/js/jquery-1.8.3.js" type="text/javascript"></script>
<script src="jquery-ui-1.9.2.custom/development-bundle/ui/jquery.ui.widget.js" type="text/javascript"></script>
<script src="jquery-ui-1.9.2.custom/development-bundle/ui/jquery.ui.core.js" type="text/javascript"></script>
<script src="jquery-ui-1.9.2.custom/development-bundle/ui/jquery.ui.datepicker.js" type="text/javascript"></script><link href="jquery-ui-1.9.2.custom/development-bundle/themes/ui-lightness/jquery.ui.all.css" rel="stylesheet" type="text/css" />

默认时间插件显示的是英文,我们给他汉化

新建initdatepicker_cn.js

function initdatepicker_cn() {
 $.datepicker.regional['zh-CN'] = {
  clearText: '清除',
  clearStatus: '清除已选日期',
  closeText: '关闭',
  closeStatus: '不改变当前选择',
  prevText: '<上月',
  prevStatus: '显示上月',
  prevBigText: '<<',
  prevBigStatus: '显示上一年',
  nextText: '下月>',
  nextStatus: '显示下月',
  nextBigText: '>>',
  nextBigStatus: '显示下一年',
  currentText: '今天',
  currentStatus: '显示本月',
  monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
  monthNamesShort: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
  monthStatus: '选择月份',
  yearStatus: '选择年份',
  weekHeader: '周',
  weekStatus: '年内周次',
  dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
  dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
  dayNamesMin: ['日', '一', '二', '三', '四', '五', '六'],
  dayStatus: '设置 DD 为一周起始',
  dateStatus: '选择 m月 d日,DD',
  dateFormat: 'yy-mm-dd',
  firstDay: 1,
  initStatus: '请选择日期',
  isRTL: false
 };
 $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
}

  前台页面添加jquery脚本,当然MainContent_txtBeginTime是你时间标签的id,有时候你可能显示不出来,不要着急右键查看源文件就会发现控件的id和html标签的id不一样,我们一定要选择标签的id

<script type="text/javascript">

 jQuery(function () {

  initdatepicker_cn();
  $('#MainContent_txtBeginTime').datepicker({ changeMonth: true, changeYear: true });
 });
</script>

效果图:

如果你按照这四步去做的话,一个简单实用的分页显示页面就会展现的你的面前,欢迎大家进行讨论。

(0)

相关推荐

  • ASP.NET数据绑定GridView控件使用技巧

    不得不说GridView控件的功能确实很强大,一个简简单单的控件就可以把数据管理的很美.在这两天做的任务中碰到的一些GridView控件中遇到的问题进行总结: ①:在GridView控件中随意显示数据库中的信息: GridView控件中有一个AutoGenerateColumns属性,它的作用就是控制GridView控件是否在运行的时候自动生成相关联的列,一般情况下把这个属性设置成为false.因为我们需要的是一个DIY的GridView控件.然后点击右上角的箭头,选择编辑列添加一个BoundF

  • asp.net中日历函数Calendar的使用方法

    今天介绍的是微软提供的ajax calendar控件.这个控件使用了ajax的效果,并通过前台js和style设置事件和效果.功能丰富.样式自有,实为网站设计.mis开发之必备控件. 按照惯例,现在该贴代码了: <asp教程:textbox runat="server" id="txtcalendar" width="150" /> <ajaxtoolkit:calendarextender runat="server

  • ASP.NET文件上传控件Uploadify的使用方法

    对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步机制,当大文件通过HTTP方式发送到服务端时,对于服务端站点的主线程影响比较大,会产生阻塞,所以,现在很多上传控制都是异步,多线程的方式去实现的. 今天来介绍一个文件上传控制,它就是Uploadify,它应该是flash的异步上传工具,对于大文件支持还不错,所以,我选择了它. 相关API介绍 upl

  • asp.net数据验证控件

    1.非空数据验证控件RequiredFiledValidator. 属性:ControlToValiata 指验证控件对哪一个控件进行验证.例如验证TextBox控件的ID属性txtPwd,只要将RequiredFiledValidator.控件的ControlToValidata属性设置为txtPwd.代码:this.RequiredFiledValidator1.ControlToValidata="txtPwd"; ErrorMessage属性:用于指定页面中使用Required

  • asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序

    数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

  • ASP.NET中为TextBox中添加calendar.js示例代码

    1.在工程文件下面新建文件夹"js",然后向其中添加JavaScript.js新建项,重命名为calendar.js. 2.向calendar.js中写入代码, 复制代码 代码如下: var cal; var isFocus=false; //是否为焦点 //function SelectDate(obj,strFormat) //两个参数改为只传一个 function SelectDate(obj) { var date = new Date(); var by = date.get

  • ASP.NET数据绑定之Repeater控件

    在ASP.NET的学习过程中,其控件的学习和使用占了很大的一部分,本文为大家介绍一下控件Repeater控件的使用,用它来绑定后台数据,然后在客户端(浏览器)上显示出来! 一. Repeater控件 1.用途:使用模板循环显示数据. 2.包含的模板: <ItemTemplate></ItemTemplate> 项目模板(里面的数据正常显示) <AlternatingItemTemplate></AlternatingItemTemplate> 交错显示模板(

  • ASP.NET数据绑定之DataList控件实战篇

    上篇文章大概讲了DataList的一些基础知识,掌握这些知识在将来的应用中起到很大的作用,现在我们就开始讲上篇文章中说的基础知识做一个小例子.     首先,我机子的数据库中有一张person表,如下图所示. 现在,我们用DataList控件将表中的信息显示出来,并可以在DataList控件上对数据库中的表进行编辑操作.     1.首先用vs创建web应用程序,添加web窗体,在web窗体内拉入DataList控件,右击控件,选择编辑项模板,在这里我们能看到四个模板,其中两个是Selected

  • ASP.NET中BulletedList列表控件使用及详解

    BulletedList 控件创建一个无序或有序(编号)的项列表,它们分别呈现为 HTML UL 或 OL 标记.可以指定项.项目符号或编号的外观,可以静态定义列表项或通过将控件绑定到数据来定义列表项,也可以在用户单击项时作出响应. 对于ASP.NET 1.x里要动态显示Bulledted List时,要么自己利用HTML的<ol>或<ul>元素构造,要么就是"杀鸡用牛刀"的动用Repeater来显示.前者过于死板,后者过于Overkill,也许微软听到这种声音

  • ASP.NET数据绑定之GridView控件

    GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridView已经走上了历史的前台,取代DataGrid的趋势已是势不挡.  作用:其功能是在web页面中显示数据源中的数据.GridView和DataGrid功能相似,都是在web页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在web页面上输出表格中的一行.     在此GirdView的详细属性和事件我不再阐述.下面我只是简单介绍一下GirdVi

  • ASP.NET Calendar日历(日期)控件使用方法

    Calendar 控件显示一个日历,用户可通过该日历导航到任意一年的任意一天.当 ASP.NET 网页运行时,Calendar 控件以 HTML 表格的形式呈现.因此,该控件的许多属性与多种不同的表格格式相符.在这些属性中,有几个在一些低版本的浏览器中不能得到完全支持,因此在这些浏览器中并不能使用所有的格式功能. 使用 Calendar 控件在网页上显示日历的单个月.该控件使您可以选择日期并移到下个月或上个月.Calendar 控件支持 System.Globalization 命名空间中的所有

  • ASP.NET多文件上传控件Uploadify的使用方法

    对于Uploadify文件上传之前已经讲过一次(文件上传~Uploadify上传控件),只不过没有涉及到多文件的上传,这回主要说一下多个文件的上传,首先,我们要清楚一个概念,多文件上传前端Uploadify是通过轮训的方式去调用我们的后台upload程序的,所以,对于多文件上传来说,也没什么稀奇的. 下面是文件上传后的缩略图如下 列表的组装使用JS模板,这样对于复杂的HTML结构来说,可以减少拼写错误的出现,关闭是将LI元素从UI元素移除,最后提交时,从UI里检查LI元素,然后对它进行组装,并进

随机推荐