一个分页跟动态创建列的控件

using System;
using System.Web;
using System.IO;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace Yeno
{
///

1<summary>   
2/// coolPager 的摘要说明。   
3/// </summary>

#region 构造枚举类型
public enum SortType
{
ASC=0,Desc=1
};
public enum IsCount
{
noReturnRecordCount=0,returnRecordCount
};
public enum ManageSwitch
{
ON=0,OFF
};
#endregion
[DefaultProperty(""),
ToolboxData("<{0}:EINews runat=server>

")]
public class EINews : System.Web.UI.WebControls.WebControl,INamingContainer
{
protected int recordCount=0;
protected Control _controlToPaginate;
protected PagedDataSource _dataSource;
protected Repeater _rp=new Repeater();
protected string _connectionString="",_tableName="";

#region 属性
[Bindable(true),
Category("控件专有属性"),
Description("数据源连接字符串"),
DefaultValue("")]
public string connectionString
{
get
{
return _connectionString;
}
set
{
_connectionString=value;
}
}
//表名
[Category("控件专有属性"),Description("查询表名"),DefaultValue("")]
public string tableName
{
get
{
return _tableName;
}
set
{
_tableName=value;
}
}
//排序字段名
[Category("控件专有属性"),Description("排序字段"),DefaultValue("")]
public string fieldName
{
get
{
Object obj=ViewState["fieldName"];
return (obj==null)?String.Empty:obj.ToString();
}
set
{
ViewState["fieldName"]=value;
}
}
//每页显示记录数
[Category("控件专有属性"),Description("每页记录数"),DefaultValue("")]
public int pageSize
{
get
{
Object obj=ViewState["pageSize"];
return (obj==null)?15:Convert.ToInt32(obj);
}
set
{
ViewState["pageSize"]=value;
}
}
//页码
[Category("控件专有属性"),Description("当前页码"),DefaultValue(""),Browsable(false)]
public int pageIndex
{
get
{
Object obj=ViewState["pageIndex"];
return (obj==null)?1:Convert.ToInt32(obj);
}
set
{
ViewState["pageIndex"]=value;
}
}
//是否返回记录总数
[Category("控件专有属性"),Description("是否返回记录总数"),DefaultValue(""),Browsable(false)]
public IsCount isCount
{
get
{
return IsCount.returnRecordCount;
}
}
//排序类型
[Category("控件专有属性"),Description("排序类型"),DefaultValue("")]
public SortType sortType
{
get
{
Object obj=ViewState["sortType"];
return (obj==null)?SortType.ASC:(SortType)obj;
}
set
{
ViewState["sortType"]=value;
}
}
[Category("控件专有属性"),Description("显示导航数字数"),DefaultValue("")]
public int showPageNumber
{
get
{
Object obj=ViewState["showPageNumber"];
return (obj==null)?10:Convert.ToInt32(obj);
}
set
{
ViewState["showPageNumber"]=value;
}
}
[Category("控件专有属性"),Description("开始页"),DefaultValue(""),Browsable(false)]
public int pageStart
{
get
{
Object obj=ViewState["pageStart"];
return (obj==null)?1:Convert.ToInt32(obj);
}
set
{
ViewState["pageStart"]=value;
}
}
[Category("控件专有属性"),Description("总页数,自动生成"),DefaultValue(""),Browsable(false)]
public int pageCount
{
get
{
Object obj=ViewState["pageCount"];
return (obj==null)?1:Convert.ToInt32(obj);
}
set
{
ViewState["pageCount"]=value;
}
}

[Category("控件专有属性"),Description("类型"),DefaultValue("")]
public string newsType
{
set
{
ViewState["newsType"]=value;
}
get
{
Object obj=ViewState["newsType"];
return (obj==null)?String.Empty:obj.ToString();
}
}
[Category("控件专有属性"),Description("表格CSS"),DefaultValue("")]
public string tableCSS
{
set
{
ViewState["tableCSS"]=value;
}
get
{
Object obj=ViewState["tableCSS"];
return (obj==null)?String.Empty:obj.ToString();
}
}
[Category("控件专有属性"),Description("AlternateCSS"),DefaultValue("")]
public string alternateCSS
{
set
{
ViewState["alternateCSS"]=value;
}
get
{
Object obj=ViewState["alternateCSS"];
return (obj==null)?String.Empty:obj.ToString();
}
}
[Category("控件专有属性"),Description("itemCSS"),DefaultValue("")]
public string itemCSS
{
set
{
ViewState["itemCSS"]=value;
}
get
{
Object obj=ViewState["itemCSS"];
return (obj==null)?String.Empty:obj.ToString();
}
}
[Category("控件专有属性"),Description("buttonCSS"),DefaultValue("")]
public string buttonCSS
{
set
{
ViewState["buttonCSS"]=value;
}
get
{
Object obj=ViewState["buttonCSS"];
return (obj==null)?String.Empty:obj.ToString();
}
}
[Category("控件专有属性"),Description("textboxCSS"),DefaultValue("")]
public string textboxCSS
{
set
{
ViewState["textboxCSS"]=value;
}
get
{
Object obj=ViewState["textboxCSS"];
return (obj==null)?String.Empty:obj.ToString();
}
}
//Where子句
[Category("控件专有属性"),Description("where子句,不带where"),DefaultValue("")]
public string Where
{
get
{
Object obj=ViewState["Where"];
string NewsType="TYPE like '%"+newsType+"%'";
return (obj==null)?NewsType:NewsType+" and "+obj.ToString();
}
set
{
ViewState["Where"]=value;
}
}
[Category("控件专有属性"),Description("新闻显示页面名称!")]
public string newsShowPage
{
get
{
Object obj=ViewState["newsShowPage"];
return (obj==null)?String.Empty:obj.ToString();
}
set
{
ViewState["newsShowPage"]=value;
}
}
[Category("控件专有属性"),Description("是否开放管理功能!")]
public ManageSwitch manageSwitch
{
get
{
Object obj=ViewState["manageSwitch"];
return (obj==null)?ManageSwitch.OFF:(ManageSwitch)obj;
}
set
{
ViewState["manageSwitch"]=value;
}
}
[Category("控件专有属性"),Description("编辑页文件名!")]
public string editPage
{
get
{
Object obj=ViewState["editPage"];
return (obj==null)?String.Empty:obj.ToString();
}
set
{
ViewState["editPage"]=value;
}
}
[Category("控件专有属性"),Description("删除页文件名!")]
public string deletePage
{
get
{
Object obj=ViewState["deletePage"];
return (obj==null)?String.Empty:obj.ToString();
}
set
{
ViewState["deletePage"]=value;
}
}
#endregion

///

1<summary>   
2/// 将此控件呈现给指定的输出参数。   
3/// </summary>

///

1<param name="output"/>

要写出到的 HTML 编写器
protected override void Render(HtmlTextWriter output)
{
if(Page.EnableViewState==false)
Page.EnableViewState=true;
if(Site!=null && Site.DesignMode)
CreateChildControls();
//DataBind();
base.Render(output);
}
public override void DataBind()
{
base.DataBind();

ChildControlsCreated = false;

if (connectionString == "" || tableName == "")
return;

// Fetch data
FetchData();

// Bind data to the buddy control
_rp.DataSource = _dataSource;
_rp.DataBind();
return;
}
private void ErrorShow(string errorMessage)
{
HttpContext.Current.Response.Write("

1<script language="javascript">window.alert(\""+errorMessage+"\");</script>

");
}
private void FetchData()
{
#region
SqlConnection cn=new SqlConnection();
SqlCommand cm=new SqlCommand();
cm.Connection=cn;
SqlDataAdapter adapter=new SqlDataAdapter();
try
{
cn.ConnectionString=connectionString;
cm.Connection.Open();

cm.CommandText="GetRecordFromPage";
cm.CommandType=CommandType.StoredProcedure;
cm.Parameters.Add("@tblName",SqlDbType.NVarChar,255);
cm.Parameters.Add("@fldName",SqlDbType.NVarChar,255);
cm.Parameters.Add("@PageSize",SqlDbType.Int);
cm.Parameters.Add("@PageIndex",SqlDbType.Int);
cm.Parameters.Add("@isCount",SqlDbType.Bit);
cm.Parameters.Add("@OrderType",SqlDbType.Bit);
cm.Parameters.Add("@strWhere",SqlDbType.NVarChar,1000);
cm.Parameters["@tblName"].Value=tableName;
cm.Parameters["@fldName"].Value=fieldName;
cm.Parameters["@PageSize"].Value=pageSize;
cm.Parameters["@PageIndex"].Value=pageIndex;
cm.Parameters["@isCount"].Value=0;
cm.Parameters["@OrderType"].Value=sortType;
cm.Parameters["@strWhere"].Value=Where;

adapter.SelectCommand=cm;
DataTable dtb = new DataTable();
adapter.Fill(dtb);

cm.Parameters["@isCount"].Value=isCount;
recordCount=(int)cm.ExecuteScalar();
pageCount=(int)Math.Ceiling((double)recordCount/pageSize);

// Configures the paged data source component
if (_dataSource == null)
_dataSource = new PagedDataSource();
_dataSource.AllowCustomPaging = true;
_dataSource.AllowPaging = true;
_dataSource.CurrentPageIndex = 0;
if(pageIndex==pageCount)
{
_dataSource.PageSize = (recordCount-(pageIndex-1)*pageSize);
}
else
{
_dataSource.PageSize = pageSize;
}
if(pageIndex==pageCount)
{
_dataSource.VirtualCount = (recordCount-(pageIndex-1)*pageSize);
}
else
{
_dataSource.VirtualCount = pageSize;
}
_dataSource.DataSource = dtb.DefaultView;
}
catch
{
ErrorShow("从数据库取得数据时发生错误!");
}
finally
{
cm.Connection.Close();
cm.Dispose();
cn.Dispose();
adapter.Dispose();
}
#endregion
}
protected override void CreateChildControls()
{
#region
try
{
Controls.Clear();
if(!Page.IsPostBack)
{
ClearChildViewState();
}

//***********************************************
Table table1=new Table();
table1.Width=Unit.Percentage(100);
table1.Height=Unit.Percentage(100);
TableRow tr1=new TableRow();
TableCell td1=new TableCell();
td1.VerticalAlign=VerticalAlign.Top;
td1.Height=Unit.Percentage(100);

_rp.HeaderTemplate=new MyTemplate(ListItemType.Header,tableCSS,alternateCSS,itemCSS,newsShowPage,manageSwitch,editPage,deletePage);
_rp.ItemTemplate=new MyTemplate(ListItemType.Item,tableCSS,alternateCSS,itemCSS,newsShowPage,manageSwitch,editPage,deletePage);
_rp.AlternatingItemTemplate=new MyTemplate(ListItemType.AlternatingItem,tableCSS,alternateCSS,itemCSS,newsShowPage,manageSwitch,editPage,deletePage);
_rp.FooterTemplate=new MyTemplate(ListItemType.Footer,tableCSS,alternateCSS,itemCSS,newsShowPage,manageSwitch,editPage,deletePage);
_rp.ID="SHOW";

//Controls.Add(_rp);
td1.Controls.Add(_rp);
tr1.Cells.Add(td1);
table1.Rows.Add(tr1);
TableRow tr2=new TableRow();
TableCell td2=new TableCell();
td2.VerticalAlign=VerticalAlign.Bottom;

Table table=new Table();
table.Width=Unit.Percentage(100);
table.CellPadding=0;
table.CellSpacing=3;
table.BorderWidth=0;
table.Font.Size=FontUnit.Point(10);

TableRow tr=new TableRow();

TableCell tdInfo=new TableCell();
tdInfo.Width=Unit.Percentage(30);
tdInfo.HorizontalAlign=HorizontalAlign.Left;
BuildInfo(tdInfo);
tr.Cells.Add(tdInfo);

TableCell tdNavigate=new TableCell();
tdNavigate.Width=Unit.Percentage(50);
tdNavigate.HorizontalAlign=HorizontalAlign.Center;
BuildNavigator(tdNavigate);
tr.Cells.Add(tdNavigate);

TableCell tdGOTO=new TableCell();
tdGOTO.Width=Unit.Percentage(20);
tdGOTO.HorizontalAlign=HorizontalAlign.Right;
BuildGOTO(tdGOTO);
tr.Cells.Add(tdGOTO);

table.Rows.Add(tr);

td2.Controls.Add(table);
tr2.Cells.Add(td2);
table1.Rows.Add(tr2);
Controls.Add(table1);
//Controls.Add(table);
DataBind();
}
catch(Exception ex)
{
ErrorShow("创建子控件时发生错误:"+ex.Message);
}
#endregion
}
private void BuildInfo(TableCell td)
{
LiteralControl lc=new LiteralControl();
lc.Text="页码:"+pageIndex.ToString()+"|"+pageCount.ToString()+" 记录:"+((pageIndex-1)*pageSize+1)+"-"+((recordCount

  1<pagesize)?recordcount:((pageindex==pagecount)?recordcount:pageindex*pagesize))+"|"+recordcount; #region="" buildnavigator(tablecell="" if(pageindex="" int="" private="" td)="" td.controls.add(lc);="" temp;="" void="" {="" }="">showPageNumber)   
  2{   
  3LinkButton lbBack=new LinkButton();   
  4lbBack.CausesValidation=false;   
  5lbBack.Text="...";   
  6lbBack.CommandArgument="Back";   
  7lbBack.Command +=new CommandEventHandler(lb_Click);   
  8td.Controls.Add(lbBack);   
  9td.Controls.Add(new LiteralControl(" "));   
 10}   
 11//*************************   
 12for(int i=0;i<showpagenumber;i++) +="new" commandeventhandler(lbnumber_click);="" if((pagecount-pagestart)="" if((pagestart+i)<="pageCount)" lbnumber="new" lbnumber.causesvalidation="false;" lbnumber.command="" lbnumber.commandargument="temp.ToString();" lbnumber.text="temp.ToString();" linkbutton="" linkbutton();="" literalcontrol("&nbsp;"));="" td.controls.add(lbnumber);="" td.controls.add(new="" temp="pageStart+i;" {="" }="">showPageNumber)   
 13{   
 14LinkButton lbForward=new LinkButton();   
 15lbForward.CausesValidation=false;   
 16lbForward.Text="...";   
 17lbForward.CommandArgument="Forward";   
 18lbForward.Command +=new CommandEventHandler(lb_Click);   
 19td.Controls.Add(lbForward);   
 20}   
 21#endregion   
 22}   
 23private void BuildGOTO(TableCell td)   
 24{   
 25#region   
 26TextBox tb=new TextBox();   
 27tb.ID="gotoPage";   
 28tb.BorderWidth=Unit.Pixel(1);   
 29tb.Width=Unit.Pixel(30);   
 30tb.CssClass=textboxCSS;   
 31tb.EnableViewState=true;   
 32td.Controls.Add(tb); 
 33
 34LiteralControl lc=new LiteralControl(" ");   
 35td.Controls.Add(lc); 
 36
 37Button btn=new Button();   
 38btn.Text="GOTO";   
 39btn.CssClass=buttonCSS;   
 40btn.CommandArgument=tb.ClientID;   
 41btn.Command +=new CommandEventHandler(lb_Click);   
 42td.Controls.Add(btn); 
 43
 44RequiredFieldValidator val2=new RequiredFieldValidator();   
 45val2.ControlToValidate="gotoPage";   
 46val2.ErrorMessage="页码不能为空!";   
 47val2.Display=ValidatorDisplay.None;   
 48val2.ID="val2";   
 49td.Controls.Add(val2); 
 50
 51RangeValidator val1=new RangeValidator();   
 52val1.Display=ValidatorDisplay.None;   
 53val1.ErrorMessage="无效的页码!";   
 54val1.ID="val1";   
 55val1.ControlToValidate="gotoPage";   
 56val1.Type=ValidationDataType.Integer;   
 57val1.MinimumValue="1";   
 58if(pageCount&lt;1)   
 59{   
 60val1.MaximumValue="1";   
 61}   
 62else   
 63{   
 64val1.MaximumValue=pageCount.ToString();   
 65}   
 66  
 67td.Controls.Add(val1); 
 68
 69ValidationSummary valAll=new ValidationSummary();   
 70valAll.ShowMessageBox=true;   
 71valAll.ShowSummary=false;   
 72td.Controls.Add(valAll);   
 73#endregion   
 74}   
 75private void lb_Click(Object Sender,CommandEventArgs e)   
 76{   
 77#region   
 78switch(e.CommandArgument.ToString())   
 79{   
 80case "Back":   
 81pageStart-=showPageNumber;   
 82pageIndex=pageStart;   
 83CreateChildControls();   
 84break;   
 85case "Forward":   
 86pageStart+=showPageNumber;   
 87pageIndex=pageStart;   
 88CreateChildControls();   
 89break;   
 90default:   
 91string temp=Page.Request.Form[this.ClientID+":gotoPage"].ToString().Trim();   
 92try   
 93{   
 94pageIndex=Convert.ToInt32(temp);   
 95if(pageIndex % showPageNumber==0)   
 96{   
 97pageStart=pageIndex+1-showPageNumber;   
 98}   
 99else   
100{   
101pageStart=(int)Math.Floor((double)pageIndex/showPageNumber)*showPageNumber+1;   
102}   
103CreateChildControls();   
104}   
105catch   
106{   
107ErrorShow("翻页时发生错误!");   
108}   
109break;   
110}   
111DataBind();   
112#endregion   
113}   
114private void lbNumber_Click(Object Sender,CommandEventArgs e)   
115{   
116pageIndex=Convert.ToInt32(e.CommandArgument);   
117DataBind();   
118}   
119}   
120public class MyTemplate : ITemplate   
121{   
122#region   
123ListItemType templateType;   
124string tableCSS="";   
125string alternateCSS="";   
126string itemCSS="";   
127string newsShowPage="";   
128string editPage="";   
129string deletePage="";   
130ManageSwitch _manageSwitch; 
131
132public MyTemplate(ListItemType type)   
133{   
134templateType = type;   
135}   
136public MyTemplate(ListItemType type,string TableCSS,string AlternateCSS,string ItemCSS,string NewsShowPage,ManageSwitch manageSwitch,string EditPage,string DeletePage)   
137{   
138templateType = type;   
139tableCSS=TableCSS;   
140alternateCSS=AlternateCSS;   
141itemCSS=ItemCSS;   
142newsShowPage=NewsShowPage;   
143_manageSwitch=manageSwitch;   
144editPage=EditPage;   
145deletePage=DeletePage;   
146} 
147
148  
149public void InstantiateIn(System.Web.UI.Control container)   
150{   
151Literal lc = new Literal();   
152switch(templateType)   
153{   
154case ListItemType.Header:   
155lc.Text="<table cellpadding='\"5\"' cellspacing='\"0\"' class='\""+tableCSS+"\"'>";   
156break;   
157case ListItemType.Item:   
158lc.Text="<tr><td class='\""+itemCSS+"\"'>";   
159lc.DataBinding += new EventHandler(TemplateControl_DataBinding);   
160break;   
161case ListItemType.AlternatingItem:   
162lc.Text = "<tr><td class='\""+alternateCSS+"\"'>";   
163lc.DataBinding += new EventHandler(TemplateControl_DataBinding);   
164break;;   
165case ListItemType.Footer:   
166lc.Text = "</td></tr></td></tr></table>";   
167break;   
168}   
169container.Controls.Add(lc);   
170}   
171private void TemplateControl_DataBinding(object sender,System.EventArgs e)   
172{   
173string css="";   
174Literal lc;   
175lc = (Literal) sender;   
176RepeaterItem container = (RepeaterItem) lc.NamingContainer;   
177lc.Text += "["+Convert.ToString(DataBinder.Eval(container.DataItem,"PREFIX")).Trim()+"] "+DataBinder.Eval(container.DataItem,"TITLE","<a href='\""+newsShowPage+"?NEWSID="+DataBinder.Eval(container.DataItem,"ID")+"\"' target='\"_blank\"'>{0}</a>")+"  "+DataBinder.Eval(container.DataItem,"PUB_TIME","{0:yyyy-M-d}");   
178lc.Text+="";   
179if(_manageSwitch==ManageSwitch.ON)   
180{   
181switch(templateType)   
182{   
183case ListItemType.Item:   
184css=itemCSS;   
185break;   
186case ListItemType.AlternatingItem:   
187css=alternateCSS;   
188break;;   
189}   
190lc.Text+="<td class='\""+css+"\"'><a href='\""+editPage+"?NEWSID="+DataBinder.Eval(container.DataItem,"ID")+"\"' target='\"_blank\"'>编辑</a></td>";   
191lc.Text+="<td class='\""+css+"\"'><a href='\""+deletePage+"?NEWSID="+DataBinder.Eval(container.DataItem,"ID")+"\"' target='\"_blank\"'>删除</a></td>";   
192}   
193lc.Text+="";   
194}   
195#endregion   
196}   
197}</showpagenumber;i++)></pagesize)?recordcount:((pageindex==pagecount)?recordcount:pageindex*pagesize))+"|"+recordcount;>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus