`

小知识(十)

 
阅读更多

1.virtual(虚方法)+override(重写) 与 new(覆盖)

virtual+override 与 new 都能实现子类对其父类 方法的改变,但前者能实现多态性

比如  父类class1有方法a()、b()  子类class2有方法c()

class1 c1=new class2(); 

这时c1只能 . 点出c1.a()  c1.b()  这俩class1自己的方法   实例方法看类型

但如果父类class1有vitual a()、b()   子类class2有override a()、c()

 这时c1能 . 点出c1.a()  c1.b()  这俩方法   但此时c1.a()调用的是class2中的a()方法,虚方法看对象 而class2中的a()可以完全不同于class1中的a(),从而实现多态性(指同一事物在不同的条件下可以表现出不同的形态)

以上到底是调用哪个类的a() 我们可以看here 记住 静态方法看类型、实例方法看类型、虚方法看对象 

至于new可以类似的看成是实例方法,但有些不同,如下:

 public class Class1
    {
        public virtual string print()
        {
            return "class1";
        }
        public void class1() { }
        public virtual string class1_1() { return "class1"; }
    }
    public class Class2 : Class1
    {
        public override string print()
        {
            return "class2";
        }
    }
    public class Class3 : Class2
    {
        public override string print()
        {
            return "class3";
        }
    }
    public class Class4 : Class3
    {
        public new string print()
        {
            return "class4";
        }
    }
    public class Class5 : Class4
    {
        public new string print()
        {
            return "class5";
        }
        public override string class1_1(){ return "class5";}
        public void class5() { }
    }

  protected void Page_Load(object sender, EventArgs e)

        {
            Class5 c5 = new Class5();
            Class1 c1 = c5;  //子类引用隐式转换为父类引用(将子类引用赋值给父类引用)(等同于 Class1 c1 =  new Class5(); 父类引用指向子类对象)
            Label1.Text += c1.print();  //class3  这里print()不能看成虚方法,因为Class5里是用的new而不是override
            Label1.Text += " " + c1.class1_1();  //class5
        }

[ 插播: 一个父类class1与其子类class2,之间的转型只能是父类引用指向子类对象(或子类引用隐式转换为父类引用):

class1 c1=new class2();  或 class2 c2=new class2(); class1 c1=c2;

而  class2 c2=(class2)new class1();  或 class1 c1=new class1(); class2 c2=(class2)c1;  

虽然能通过编译,但运行时会报错  System.InvalidCastException ]

 

我们可以看两个有继承关系的类,俩类中有相同的方法 一个是virtual 一个是override 这样才能算是虚方法看对象

而这里一个是virtual 一个是new 不能算是虚方法看对象 可以近似的看成是 实例方法看类型

但new的类型与纯实例方法不同,我们看到了c1.print()输出class3  而不是class1   因为new要看到这个继承链中距离该类型(实例方法看类型的这个类型这里是class1) 最远的override,这里就是class3了,再远就是class4,而class4是new,如果把class2里的override改成virtual,那么将输出class1,因为class2并没有override class1的方法,所以到class1就是最远了     这里就是Class3了,其print()输出class3

现在再来看一个纯实例方法看类型

 public class Class6
    {
        public string print1()
        {
            return "class6";
        }
    }
    public class Class7:Class6
    {
        public string print2()
        {
            return "class7";
        }
    }
    public class Class8:Class7
    {
        public  string print3()
        {
            return "class8";
        }
    }

  protected void Page_Load(object sender, EventArgs e)

 {
    Class8 c8 = new Class8();
    Class6 c6 = c8;
    Label2.Text += c6.print1();  //class6
 }

 

2.GetType().GetField()

FieldInfo fi = this.GetType().GetField(字段名, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase);

if(fi!=null){fi.GetValue(this);}

以上语句的意思是取得某个对象(这里是this就是当前对象)的某个公共字段(可以指定字段名,也有GetFields()方法获取对象的所有字段)并将其返回给字段信息类FieldInfo的对象fi,然后通过fi.GetValue(this)获取该对象的某个字段的值,这时就可以将该值强制转换回它本来的类型了,这时就可以操作该字段了

比如这里获取的字段本来是string[]类型  (string[])fi.GetValue(this)

如果字段类型是控件类型,比如Text  我们就可以操作这个文本框控件的属性等了,如下:

http://topic.csdn.net/u/20080805/19/d4fcd0c2-6124-4456-8b02-968f3c4bdc4e.html

 

3.Excel导入 http://www.cnblogs.com/tonyqus/archive/2009/12/25/1631075.html

   1.

    public class ImportExcel

    {
      HSSFWorkbook hssfworkbook;
      /// <summary>
      /// 读取指定路径的Excel表格里的全部数据
      /// </summary>
      /// <param name="path">Excel表格的物理路径</param>
      /// <param name="sheetindex">读取哪一个sheet</param>
      /// <returns>DataTable</returns>
      public DataTable ReadExcel(string path,int sheetindex,int startrow)
      {
          using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
          {
              hssfworkbook = new HSSFWorkbook(file);
          }
          try
          {
              ISheet sheet = hssfworkbook.GetSheetAt(sheetindex);
              System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
              DataTable dt = new DataTable();
              int cellcount = 0;
              while (rows.MoveNext())
              {
                 int max=((HSSFRow)rows.Current).LastCellNum;
                 if (max>cellcount)
                 {
                     cellcount = max;
                 }
              }
              for (int j = 1; j < cellcount+1; j++)
              {
                  //dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
                  if (j==1)
                  {
                     dt.Columns.Add("行号/列号");
                  }
                  dt.Columns.Add("列"+j.ToString());
              }
              rows.Reset();
              int currentrow = 0;
              while (rows.MoveNext())
              {
                  currentrow++;
                  if (currentrow<startrow)
                  {
                      continue;
                  }
                  HSSFRow row = (HSSFRow)rows.Current;
                  DataRow dr = dt.NewRow();
                  if (currentrow == startrow)
                  {
                      dr[0] = "";
                  }
                  else
                  {
                      dr[0] = "行"+(currentrow-startrow).ToString();
                  }
                  for (int i = 0; i < row.LastCellNum; i++)
                  {
                      ICell cell = row.GetCell(i);
                      if (cell == null)
                      {
                          dr[i+1] = null;
                      }
                      else
                      {
                          if (currentrow == startrow)
                          {
                              dr[i + 1] = cell.ToString();
                          }
                          else
                          {
                              string typestr = GetType(cell.CellType);
                              dr[i + 1] = cell.ToString()+"-"+(currentrow-startrow)+"行"+(i+1).ToString()+"列"+"-"+"[" + typestr + "]";
                          }
                      }
                  }
                  dt.Rows.Add(dr);
              }           
              return dt;
          }
          catch (Exception e)
          {
              return null;
          }
      }
      public string GetType(CellType ct)
      {
          string typestr = null;
          switch (ct)
          {
              case CellType.BLANK:
                  typestr= "空白型";
                  break;
              case CellType.BOOLEAN:
                  typestr = "布尔型";
                  break;
              case CellType.ERROR:
                  typestr = "错误";
                  break;
              case CellType.FORMULA:
                  typestr = "公式型";
                  break;
              case CellType.NUMERIC:
                  typestr = "数值型";
                  break;
              case CellType.STRING:
                  typestr = "文本型";
                  break;
              case CellType.Unknown:
                  typestr = "Unknown";
                  break;
          }
          return typestr;
      }
    }

    2.

public class ExcelHelper
    {
        string[] DataType = null; //数据类型数组
        string[] IsMust =null;    //是否必填数组 
        MobanItem mobandal = new MobanItem(); //填报模板(子)
        /// <summary>
        /// 获取上传的Excel文件数据,同时判断正确性
        /// </summary>
        /// <param name="sheet">ISheet对象</param>
        /// <param name="startrow">开始读取行</param>
        /// <param name="mbID">模板ID</param>
        /// <returns>DataTable</returns>
        public DataTable ReadExcel(ISheet sheet, int startrow, int mbID)
        {
            DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
            DataType = new string[dtmoban.Rows.Count];
            IsMust = new string[dtmoban.Rows.Count];
            //获取该模板字段的数据类型及是否为空
            for (int i = 0; i < dtmoban.Rows.Count; i++)
            {   
                DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
                IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
            }
            //获取数据行
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
            DataTable dt = new DataTable();
            //获取最大列数
            int cellcount = 0;
            while (rows.MoveNext())
            {
                int max = ((HSSFRow)rows.Current).LastCellNum;
                if (max > cellcount)
                {
                    cellcount = max;
                }
            }
            for (int j = 1; j < cellcount + 1; j++)
            {
                if (j == 1)
                {
                    dt.Columns.Add("行号/列号");
                }
                dt.Columns.Add("列" + j.ToString());
            }
            //已经rows.MoveNext(),需要Reset()回到行开始处
            rows.Reset();
            int currentrow = 0;  
            //一行行、一列列向DataTable写入数据
            while (rows.MoveNext())
            {
                currentrow++;
                if (currentrow < startrow)
                {
                    continue;
                }
                HSSFRow row = (HSSFRow)rows.Current;
                DataRow dr = dt.NewRow();
                if (currentrow == startrow)
                {
                    dr[0] = "";
                }
                else
                {
                    dr[0] = "行" + (currentrow - startrow).ToString();
                }
                for (int i = 0; i < row.LastCellNum; i++)
                {
                    ICell cell = row.GetCell(i);
                    //判断是否可以为空,如果为错抛出异常(第几行第几列不能为空),调用此方法处需抓取自定义的ExcelImportException异常
                    if (cell == null && IsMust[i] == "1")
                    {
                        throw new ExcelImportException(currentrow, i + 1, "不能为空");
                    }
                    else
                    {
                        if (currentrow == startrow)
                        {
                            dr[i + 1] = cell.ToString();
                        }
                        else
                        {
                            //string typestr = GetType(cell.CellType);
                            string value = cell.ToString();
                            string type = DataType[i];
                            //判断类型是否正确,如果为错抛出异常(第几行第几列类型应该是),调用此方法处需抓取自定义的ExcelImportException异常
                            //if (typestr != DataType[i])
                            //{
                            //    throw new ExcelImportException(currentrow, i + 1, "类型应该是" + DataType[i]);
                            //}
                            if (GetTypeNew(value,type)!=true)
                            {
                                 throw new ExcelImportException(currentrow, i + 1, "类型应该是" + DataType[i]);
                            }
                            dr[i + 1] = cell.ToString();
                        }
                    }
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
       public bool GetTypeNew(string value,string type)
        {
            bool flag = true;
            switch (type)
            {
                case "空白型":
                    flag = value == "" ? true : false;
                    break;
                case "数值型":
                    try
                    {
                        decimal.Parse(value);
                    }
                    catch (Exception e)
                    {
                        flag = false;
                    }
                    break;
                case "日期型":
                    try
                    {
                        DateTime.Parse(value);
                    }
                    catch (Exception e)
                    {
                        flag = false;
                    }
                    break;
                case "文本型":
                        flag = true;
                    break;
            }
            return flag;
        }
        public string GetType(CellType ct)
        {
            string typestr = null;
            switch (ct)
            {
                case CellType.BLANK:
                    typestr = "空白型";
                    break;
                case CellType.BOOLEAN:
                    typestr = "布尔型";
                    break;
                case CellType.ERROR:
                    typestr = "错误";
                    break;
                case CellType.FORMULA:
                    typestr = "公式型";
                    break;
                case CellType.NUMERIC:
                    typestr = "数值型";
                    break;
                case CellType.STRING:
                    typestr = "文本型";
                    break;
                case CellType.Unknown:
                    typestr = "Unknown";
                    break;
            }
            return typestr;
        }
    }
public class ExcelImportException : Exception
    {
        public int rowNum;
        public int colNum;
        public string msg;
        /// <summary>
        /// 错误实体            
        /// </summary>
        /// <param name="rn">行号</param>
        /// <param name="cn">列号</param>
        /// <param name="errormsg">错误描述</param>
        public ExcelImportException(int rn, int cn, string errormsg)
        {
            rowNum = rn;
            colNum = cn;
            msg = errormsg;
        }
    }

  3   

         /// <summary>
        ///  获取上传的企业基本信息Excel文件数据,同时判断正确性
        /// </summary>
        /// <param name="sheet">ISheet对象</param>
        /// <param name="mbID">模板ID</param>
        /// <returns>DataTable</returns>
        public DataTable ReadExcel(ISheet sheet, int mbID)
        {
            DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
            DataType = new string[dtmoban.Rows.Count];
            IsMust = new string[dtmoban.Rows.Count];
            //获取该模板字段的数据类型及是否为空
            for (int i = 0; i < dtmoban.Rows.Count; i++)
            {
                DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
                IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
            }
            //获取数据行
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
            DataTable dt = new DataTable();
            //获取要导入的行号
            int importRowNum = 0;
           //获取要导入的列数
            int importColNum = 0;
            while (rows.MoveNext())
            {
                try
                {
                    string FirstCellStr = ((HSSFRow)rows.Current).GetCell(0).ToString();
                    string SecondCellStr = ((HSSFRow)rows.Current).GetCell(1).ToString();
                    if (FirstCellStr == "序号" || FirstCellStr == "组织机构代码" || SecondCellStr == "组织机构代码")
                    {
                        importRowNum = ((HSSFRow)rows.Current).RowNum + 1;
                        importColNum = ((HSSFRow)rows.Current).LastCellNum;
                        break;
                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
            //获取导入标题行的数据列数,构造DataTable架构
            try
            {
                for (int j = 0; j < importColNum; j++)
                {
                    dt.Columns.Add("列" + j.ToString());
                }
            }
            catch (Exception)
            {
                return dt;
            }
            //已经rows.MoveNext(),需要Reset()回到行开始处
            rows.Reset();
            //一行行、一列列向DataTable写入数据
            while (rows.MoveNext())
            {
                HSSFRow row = (HSSFRow)rows.Current;
                int currentRowNum = row.RowNum;
                if (currentRowNum < importRowNum)
                {
                    continue;
                }
                DataRow dr = dt.NewRow();
                //从导入行开始导入数据到DataTable  加了序号i要从1开始 DataType数组与IsMust数组下标要减1
                ICell cellxh = row.GetCell(0); //获取该行的序号
                for (int i = 1; i <  importColNum; i++)
                {
                    ICell cell = row.GetCell(i);
                    //判断是否可以为空,如果为错抛出异常(第几行第几列不能为空),调用此方法处需抓取自定义的ExcelImportException异常
                    if (cell == null && IsMust[i - 1] == "1")
                    {
                        throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", "序号[" + cellxh.ToString() + "]", "列名[" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", "错误信息[不能为空]");
                    }//可以为空
                    else if (cell == null && IsMust[i - 1] != "1")
                    {
                        dr[i] = "";
                    }
                    else
                    {
                        string value = cell.ToString();
                        string type = DataType[i - 1];
                        if (GetTypeNew(value, type) != true)
                        {
                            throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", "序号[" + cellxh.ToString() + "]", "列名[" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", "错误信息[类型应该是" + DataType[i] + "]");
                        }
                        dr[i] = cell.ToString();
                    }
                }
                dt.Rows.Add(dr);
            }
            dt.Columns.RemoveAt(0); //去掉序号列
            return dt;
        }

  4  不是遇到错误就停止,而是将所有错误都展示出来 传入的初始txtErrorInfo为 错误信息:\r\n

         /// <summary>
        ///  获取上传的企业基本信息Excel文件数据,同时判断正确性
        /// </summary>
        /// <param name="sheet">ISheet对象</param>
        /// <param name="mbID">模板ID</param>
        /// <param name="txtErrorInfo">客户端显示所有错误信息字符串</param>
        /// <returns>DataTable</returns>
        public DataTable ReadExcel(ISheet sheet, int mbID,ref string txtErrorInfo)
        {
            DataTable dtmoban = mobandal.getDetailListByMainID(mbID.ToString());
            DataType = new string[dtmoban.Rows.Count];
            IsMust = new string[dtmoban.Rows.Count];
            //获取该模板字段的数据类型及是否为空
            for (int i = 0; i < dtmoban.Rows.Count; i++)
            {
                DataType[i] = dtmoban.Rows[i]["zbdataType"].ToString();
                IsMust[i] = dtmoban.Rows[i]["isMust"].ToString();
            }
            //获取数据行
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
            DataTable dt = new DataTable();
            //获取要导入的行号
            int importRowNum = 0;
            //获取要导入的列数
            int importColNum = 0;
            while (rows.MoveNext())
            {
                try
                {
                    string FirstCellStr = ((HSSFRow)rows.Current).GetCell(0).ToString();
                    string SecondCellStr = ((HSSFRow)rows.Current).GetCell(1).ToString();
                    if (FirstCellStr == "序号" || FirstCellStr == "组织机构代码" || SecondCellStr == "组织机构代码")
                    {
                        importRowNum = ((HSSFRow)rows.Current).RowNum + 1;
                        importColNum = ((HSSFRow)rows.Current).LastCellNum;
                        break;
                    }
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
            //获取导入标题行的数据列数,构造DataTable架构
            try
            {
                for (int j = 0; j < importColNum; j++)
                {
                    dt.Columns.Add("列" + j.ToString());
                }
            }
            catch (Exception)
            {
                return dt;
            }
            //已经rows.MoveNext(),需要Reset()回到行开始处
            rows.Reset();
            //一行行、一列列向DataTable写入数据
            while (rows.MoveNext())
            {
                HSSFRow row = (HSSFRow)rows.Current;
                int currentRowNum = row.RowNum;
                if (currentRowNum < importRowNum)
                {
                    continue;
                }
                DataRow dr = dt.NewRow();
                //从导入行开始导入数据到DataTable  加了序号i要从1开始 DataType数组与IsMust数组下标要减1
                ICell cellxh = row.GetCell(0); //获取该行的序号
                for (int i = 1; i < importColNum; i++)
                {
                    ICell cell = row.GetCell(i);
                    //判断是否可以为空,如果为错抛出异常(第几行第几列不能为空),调用此方法处需抓取自定义的ExcelImportException异常
                    if (cell == null && IsMust[i - 1] == "1")
                    {
                        //throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", "序号[" + cellxh.ToString() + "]", "列名[" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", "错误信息[不能为空]");
                        txtErrorInfo += sheet.SheetName + "|序号" + cellxh.ToString() + "|列名" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "|不能为空\r\n";
                    }//可以为空
                    else if (cell == null && IsMust[i - 1] != "1")
                    {
                        dr[i] = "";
                    }
                    else
                    {
                        string value = cell.ToString();
                        if (value=="")
                        {
                             txtErrorInfo += sheet.SheetName + "|序号" + cellxh.ToString() + "|列名" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "|不能为空\r\n";
                        }
                        string type = DataType[i - 1];
                        if (GetTypeNew(value, type) != true)
                        {
                            //throw new ExcelImportExceptionNew("Sheet[" + sheet.SheetName + "]", "序号[" + cellxh.ToString() + "]", "列名[" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "]", "错误信息[类型应该是" + DataType[i] + "]");
                            txtErrorInfo += sheet.SheetName + "|序号" + cellxh.ToString() + "|列名" + sheet.GetRow(importRowNum - 1).GetCell(i).ToString() + "|类型应该是" + DataType[i] + "\r\n";
                        }
                        dr[i] = cell.ToString();
                    }
                }
                dt.Rows.Add(dr);
            }
            dt.Columns.RemoveAt(0); //去掉序号列
            if (txtErrorInfo.Length> 9) //错误信息:\r\n
            {
                dt.Clear();
            }
            return dt;
        }
 

 

 

4. .net中出现单击Button按钮不执行单击事件

这种情况很可能是因为Button按钮所在的页面有两个或两个以上的Form标签

 

5. 公司分页方法(二)

用到了用户控件,其上面可放置要分页的Reapter、GridView等...

   <div align="right" style="width: 98%">

     <uc1:PageNavigator ID="PageNavigator1" runat="server" />

   </div>

其HTML代码如下:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="controls_PageNavigator" Codebehind="PageNavigator.ascx.cs" %>
共<asp:Label runat="server" ID="LblRecordCount"/>条记录,共<asp:Label runat="server" ID="LblPageCount"/>页,当前第<asp:Label runat="server" ID="LblPageIndex" />页
 <asp:LinkButton ID="LnkBtnFirst" runat="server" CommandName="Page" OnClick="LnkBtnFirst_Click" CssClass="list_link">首页</asp:LinkButton> 
 
 <asp:LinkButton ID="LnkBtnPrevious" runat="server" CommandName="Page" OnClick="LnkBtnPrevious_Click" CssClass="list_link">上一页</asp:LinkButton> 

 <asp:LinkButton ID="LnkBtnNext" runat="server" CommandName="Page" OnClick="LnkBtnNext_Click" CssClass="list_link">下一页</asp:LinkButton> 
 
 <asp:LinkButton ID="LnkBtnLast" runat="server" CommandName="Page" OnClick="LnkBtnLast_Click" CssClass="list_link">尾页</asp:LinkButton> 
<asp:textbox id="txtNewPageIndex" runat="server" width="20px" CssClass="form"/>
<asp:linkbutton id="LnkBtnGoto" runat="server" causesvalidation="False" commandargument="-1" commandname="Page" text="Go" OnClick="LnkBtnGoto_Click" CssClass="list_link" />

 其后台代码如下:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public delegate void PageChangeHandler(object send, int nPageIndex); //定义了一个委托

public partial class controls_PageNavigator : System.Web.UI.UserControl
{
    //定义了一个基于上面委托的事件,在需要该用户控件的页面的Page_Load方法里需要给该事件注册一个方法,看下面的LnkBtnFirst_Click等方法,每当点击它们就会触发该事件从而执行注册的那个方法
    public event PageChangeHandler OnPageChange;
    private int _PageCount = 0;
    private int _RecordCount = 0;
    private int _PageIndex = 1;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public int PageCount
    {
        get 
        {
            return int.Parse(this.LblPageCount.Text);
        }
        set 
        {
            _PageCount = value;
            /*
            if (_PageCount < 2)
            {
                //this.txtNewPageIndex.Enabled = false;
                //this.LnkBtnGoto.Enabled = false;
            }
            else
            {
                //this.txtNewPageIndex.Enabled = true;
                //this.LnkBtnGoto.Enabled = true;
            }
             */
            this.LblPageCount.Text = _PageCount.ToString();
        }
    }
    public int RecordCount
    {
        get
        {
            return int.Parse(this.LblRecordCount.Text);
        }
        set
        {
            _RecordCount = value;
            this.LblRecordCount.Text = _RecordCount.ToString();
        }
    }
    public int PageIndex
    {
        get
        {
            return int.Parse(this.LblPageIndex.Text);
        }
        set
        {
            _PageIndex = value;
            this.txtNewPageIndex.Text = this.LblPageIndex.Text = _PageIndex.ToString();
            if (_PageIndex < 2)
            {
                this.LnkBtnFirst.Enabled = false;
                this.LnkBtnPrevious.Enabled = false;
            }
            else
            {
                this.LnkBtnFirst.Enabled = true;
                this.LnkBtnPrevious.Enabled = true;
            }
            if (_PageIndex >= _PageCount)
            {
                this.LnkBtnNext.Enabled = false;
                this.LnkBtnLast.Enabled = false;
            }
            else
            {
                this.LnkBtnNext.Enabled = true;
                this.LnkBtnLast.Enabled = true;
            }
        }
    }

    protected void LnkBtnFirst_Click(object sender, EventArgs e)
    {
        try
        {
            OnPageChange(sender, 1);
        }
        catch { }
    }
    protected void LnkBtnPrevious_Click(object sender, EventArgs e)
    {
        try
        {
            int n = Convert.ToInt32(this.LblPageIndex.Text);
            n--;
            OnPageChange(sender, n);
        }
        catch
        {
            throw;
        }
    }
    protected void LnkBtnNext_Click(object sender, EventArgs e)
    {
        try
        {
            int n = Convert.ToInt32(this.LblPageIndex.Text);
            n++;
            OnPageChange(sender, n);
        }
        catch 
        {
            throw;
        }
    }
    protected void LnkBtnLast_Click(object sender, EventArgs e)
    {
        try
        {
            int n = Convert.ToInt32(this.LblPageCount.Text);
            OnPageChange(sender, n);
        }
        catch
        {
            throw;
        }
    }
    protected void LnkBtnGoto_Click(object sender, EventArgs e)
    {
        int n;
        try
        {
            n = Convert.ToInt32(this.txtNewPageIndex.Text);
        }
        catch 
        {
            n = Convert.ToInt32(this.LblPageIndex.Text);
        }
        int np = Convert.ToInt32(this.LblPageCount.Text.Trim());
        if (n > np)
            n = np;
        if (n < 1)
            n = 1;
        OnPageChange(sender, n);
    }
}

使用PageNavigator页的后台代码如下:

protected void Page_Load(object sender, EventArgs e)
 {
       this.PageNavigator1.OnPageChange += new PageChangeHandler(PageNavigator1_OnPageChange);
       if (!Page.IsPostBack)
       {
          DataListBind(1);
       }
 }
void PageNavigator1_OnPageChange(object send, int nPageIndex)
{
     DataListBind(nPageIndex);
}
private void DataListBind(int PageIndex)
 {
     int nRCount, nPCount; 
     //获取分页的DataTable
     string SqlAllFields="id,name,age,sex"; //要查询的字段
     string SqlTablesAndWhere="tablename where **"; //表名及where语句
     string IndexField="id"; //主键字段
     string OrderFields="order by id desc"; //排序语句
     DataTable dt = GetPage(SqlAllFields,SqlTablesAndWhere,IndexField,OrderFields,PageIndex, 20, out nRCount, out nPCount);
     this.PageNavigator1.PageCount = nPCount;
     this.PageNavigator1.PageIndex = PageIndex;
     this.PageNavigator1.RecordCount = nRCount;
     this.Repeater1.DataSource = dt;
     this.Repeater1.DataBind();
     dt.Clear();
     dt.Dispose();
 }

上面的GetPage方法如下:

public  DataTable GetPage(string sqlallfields,string sqltablesandwhere ,string indexfield,string orderfields,int PageIndex, int PageSize, out int RecordCount, out int PageCount)
{
    
    string Sql = GetPageSql(SqlAllFields, SqlTablesAndWhere, IndexField, OrderFields, PageIndex, PageSize, out  RecordCount, out  PageCount);
    //然后执行sql语句返回DataTable
}

 上面的FetPageSql方法如下:

private  string GetPageSql(string SqlAllFields, string SqlTablesAndWhere, string IndexField, string OrderFields, int PageIndex, int PageSize, out int RecordCount, out int PageCount)
        {
            RecordCount = 0;
            PageCount = 0;
            if (PageSize <= 0)
            {
                PageSize = 10;
            }
            string SqlCount = "select count(" + IndexField + ") from " + SqlTablesAndWhere;          
            RecordCount = SqlCount查出总记录数;
            if (RecordCount % PageSize == 0)
            {
                PageCount = RecordCount / PageSize;
            }
            else
            {
                PageCount = RecordCount / PageSize + 1;
            }
            if (PageIndex > PageCount)
                PageIndex = PageCount;
            if (PageIndex < 1)
                PageIndex = 1;
            string Sql = null;
            if (PageIndex == 1)
            {
                Sql = "select top " + PageSize + " " + SqlAllFields + " from " + SqlTablesAndWhere + " " + OrderFields;
            }
            else
            {
                Sql = "select top " + PageSize + " " + SqlAllFields + " from ";
                if (SqlTablesAndWhere.ToLower().IndexOf(" where ") > 0)
                {
                    string _where = Regex.Replace(SqlTablesAndWhere, @"\ where\ ", " where (", RegexOptions.IgnoreCase | RegexOptions.Compiled);
                    Sql += _where + ") and (";
                }
                else
                {
                    Sql += SqlTablesAndWhere + " where (";
                }
                Sql += IndexField + " not in (select top " + (PageIndex - 1) * PageSize + " " + IndexField + " from " + SqlTablesAndWhere + " " + OrderFields;
                Sql += ")) " + OrderFields;
            }
            return Sql;
        }
 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics