using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
namespace MyComplexControls
{
[DefaultProperty( " Text " )]
[ToolboxData( " <{0}:MyNavigation runat=server></{0}:MyNavigation> " )]
public class MyNavigation : WebControl,INamingContainer
{
创建控件对象 #region 创建控件对象
LinkButton linkFirst = new LinkButton();
LinkButton linkPrevious = new LinkButton();
LinkButton linkNext = new LinkButton();
LinkButton linkLast = new LinkButton();
ImageButton imgFirst = new ImageButton();
ImageButton imgPrevious = new ImageButton();
ImageButton imgNext = new ImageButton();
ImageButton imgLast = new ImageButton();
DropDownList dropvalue = new DropDownList();
/**/ /// <summary>
/// 重写Controls的get属性,保证在访问复合控件的子控件时子控件已经被创建
/// EnsureChildControls()方法检查子控件是否被创建,如果没有被创建,
/// 将自动调用CreateChildControls()方法来创建子控件
/// </summary>
public override ControlCollection Controls
{
get
{
EnsureChildControls();
return base .Controls;
}
}
/**/ /// <summary>
/// 创建子控件
/// </summary>
protected override void CreateChildControls()
{
this .Controls.Clear();
dropvalue.Items.Clear();
linkFirst.Text = NFirstButtonText;
linkPrevious.Text = NPreviousButtonText;
linkNext.Text = NNextButtonText;
linkLast.Text = NLastButtonText;
linkFirst.Click += new EventHandler(linkFirst_Click);
linkPrevious.Click += new EventHandler(linkPrevious_Click);
linkNext.Click += new EventHandler(linkNext_Click);
linkLast.Click += new EventHandler(linkLast_Click);
imgFirst.ImageUrl = NFirstButtonImgurl;
imgPrevious.ImageUrl = NPreviousButtonImgUrl;
imgNext.ImageUrl = NNextButtonImgUrl;
imgLast.ImageUrl = NLastButtonImgUrl;
imgFirst.Click += new ImageClickEventHandler(imgFirst_Click);
imgPrevious.Click += new ImageClickEventHandler(imgPrevious_Click);
imgNext.Click += new ImageClickEventHandler(imgNext_Click);
imgLast.Click += new ImageClickEventHandler(imgLast_Click);
dropvalue.SelectedIndexChanged += new EventHandler(dropvalue_SelectedIndexChanged);
for ( int i = 1 ; i <= NPageCount; i ++ )
{
dropvalue.Items.Add(i.ToString());
}
dropvalue.AutoPostBack = true ;
Controls.Add(linkFirst);
Controls.Add(linkPrevious);
Controls.Add(linkNext);
Controls.Add(linkLast);
Controls.Add(imgFirst);
Controls.Add(imgPrevious);
Controls.Add(imgNext);
Controls.Add(imgLast);
Controls.Add(dropvalue);
base .CreateChildControls();
}
void dropvalue_SelectedIndexChanged( object sender, EventArgs e)
{
NPageCurrent = int .Parse(dropvalue.SelectedValue);
DataBind();
}
void imgLast_Click( object sender, ImageClickEventArgs e)
{
NPageCurrent = NPageCount;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
void imgNext_Click( object sender, ImageClickEventArgs e)
{
if (NPageCurrent < NPageCount)
{
NPageCurrent = NPageCurrent + 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
}
void imgPrevious_Click( object sender, ImageClickEventArgs e)
{
if (NPageCurrent > 1 )
{
NPageCurrent = NPageCurrent - 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
}
void imgFirst_Click( object sender, ImageClickEventArgs e)
{
NPageCurrent = 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
void linkLast_Click( object sender, EventArgs e)
{
NPageCurrent = NPageCount;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
void linkNext_Click( object sender, EventArgs e)
{
if (NPageCurrent < NPageCount)
{
NPageCurrent = NPageCurrent + 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
}
void linkPrevious_Click( object sender, EventArgs e)
{
if (NPageCurrent > 1 )
{
NPageCurrent = NPageCurrent - 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
}
void linkFirst_Click( object sender, EventArgs e)
{
NPageCurrent = 1 ;
dropvalue.SelectedIndex = NPageCurrent - 1 ;
DataBind();
}
#endregion
自定义属性 #region 自定义属性
[Description(" 要分页显示的表名 " )]
public string NTableName
{
get
{
return ViewState[ " table " ] == null ? "" : ViewState[ " table " ].ToString();
}
set
{
ViewState[ " table " ] = value;
}
}
[Description(" 当前要显示的页码 " )]
public int NPageCurrent
{
get
{
return ViewState[ " current " ] == null ? 1 : int .Parse(ViewState[ " current " ].ToString());
}
set
{
ViewState[ " current " ] = value;
}
}
[Description(" 每页的大小(记录数) " )]
public int NPageSize
{
get
{
return ViewState[ " size " ] == null ? 10 : int .Parse(ViewState[ " size " ].ToString());
}
set
{
ViewState[ " size " ] = value;
}
}
[Description(" 以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段 " )]
public string NFieldShow
{
get
{
return ViewState[ " show " ] == null ? "" : ViewState[ " show " ].ToString();
}
set
{
ViewState[ " show " ] = value;
}
}
[Description(" 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC,用于指定排序顺序 " )]
public string NFieldOrder
{
get
{
return ViewState[ " order " ] == null ? "" : ViewState[ " order " ].ToString();
}
set
{
ViewState[ " order " ] = value;
}
}
[Description(" 查询条件 " )]
public string NWhere
{
get
{
return ViewState[ " where " ] == null ? "" : ViewState[ " where " ].ToString();
}
set
{
ViewState[ " where " ] = value;
}
}
[Description(" 总页数 " )]
public int NPageCount
{
get
{
return ViewState[ " count " ] == null ? 10 : int .Parse(ViewState[ " count " ].ToString());
}
}
[Description(" 要分页的控件ID " )]
public string NControlID
{
get
{
return ViewState[ " id " ] == null ? " DataList1 " : ViewState[ " id " ].ToString();
}
set
{
ViewState[ " id " ] = value;
}
}
[Description(" 要分页的控件类型 " )]
public ControlType NControlType
{
get
{
return ViewState[ " type " ] == null ? ControlType.DataList : (ControlType)ViewState[ " type " ];
}
set
{
ViewState[ " type " ] = value;
}
}
[Description(" 用于导航的按钮的类型 " )]
public ButtonType NButtonType
{
get
{
return ViewState[ " btntype " ] == null ? ButtonType.LinkButton : (ButtonType)ViewState[ " btntype " ];
}
set
{
ViewState[ " btntype " ] = value;
}
}
[Description(" 首页按钮的文本 " )]
public string NFirstButtonText
{
get
{
return ViewState[ " firsttxt " ] == null ? " 首页 " : ViewState[ " firsttxt " ].ToString();
}
set
{
ViewState[ " firsttxt " ] = value;
}
}
[Description(" 上一页按钮的文本 " )]
public string NPreviousButtonText
{
get
{
return ViewState[ " pretxt " ] == null ? " 上一页 " : ViewState[ " pretxt " ].ToString();
}
set
{
ViewState[ " pretxt " ] = value;
}
}
[Description(" 下一页按钮的文本 " )]
public string NNextButtonText
{
get
{
return ViewState[ " nexttxt " ] == null ? " 下一页 " : ViewState[ " nexttxt " ].ToString();
}
set
{
ViewState[ " nexttxt " ] = value;
}
}
[Description(" 尾页按钮的文本 " )]
public string NLastButtonText
{
get
{
return ViewState[ " lasttxt " ] == null ? " 尾页 " : ViewState[ " lasttxt " ].ToString();
}
set
{
ViewState[ " lasttxt " ] = value;
}
}
[Description(" 首页按钮的图片路径 " )]
public string NFirstButtonImgurl
{
get
{
return ViewState[ " firstimg " ] == null ? "" : ViewState[ " firstimg " ].ToString();
}
set
{
ViewState[ " firstimg " ] = value;
}
}
[Description(" 上一页按钮的图片路径 " )]
public string NPreviousButtonImgUrl
{
get
{
return ViewState[ " preimg " ] == null ? "" : ViewState[ " preimg " ].ToString();
}
set
{
ViewState[ " preimg " ] = value;
}
}
[Description(" 下一页按钮的图片路径 " )]
public string NNextButtonImgUrl
{
get
{
return ViewState[ " nextimg " ] == null ? "" : ViewState[ " nextimg " ].ToString();
}
set
{
ViewState[ " nextimg " ] = value;
}
}
[Description(" 尾页按钮的图片路径 " )]
public string NLastButtonImgUrl
{
get
{
return ViewState[ " lastimg " ] == null ? "" : ViewState[ " lastimg " ].ToString();
}
set
{
ViewState[ " lastimg " ] = value;
}
}
[Description(" 读取配置文件中的连接字符串 " )]
public string NConString
{
get
{
return ViewState[ " key " ] == null ? " conString " : ViewState[ " key " ].ToString();
}
set
{
ViewState[ " key " ] = value;
}
}
[Description(" 存储过程名称.默认值=sp_PageView " )]
public string NProcName
{
get
{
return ViewState[ " proc " ] == null ? " proc_Navigation " : ViewState[ " proc " ].ToString();
}
set
{
ViewState[ " proc " ] = value;
}
}
#endregion
定义方法 #region 定义方法
private Control control;
public override void DataBind()
{
if (Page == null )
{
return ;
}
FindControl(Page);
if (control == null )
{
throw new Exception( " 没有指定绑定的控件或找不到要绑定的控件 " );
}
if (control is DataList)
{
DataList datalist = (DataList)control;
datalist.DataSource = GetDataSource();
datalist.DataBind();
}
else if (control is GridView)
{
GridView gridview = (GridView)control;
gridview.DataSource = GetDataSource();
gridview.DataBind();
}
dropvalue.Items.Clear();
for ( int i = 1 ; i <= NPageCount; i ++ )
{
dropvalue.Items.Add(i.ToString());
}
if (NPageCount > 0 )
{
dropvalue.SelectedIndex = NPageCurrent - 1 ;
}
ButtonShow();
}
private void FindControl(Control c)
{
foreach (Control con in c.Controls)
{
if (con.ID == NControlID)
{
control = con;
return ;
}
FindControl(con);
}
}
private DataTable GetDataSource()
{
string conString = System.Configuration.ConfigurationSettings.AppSettings[NConString];
if (conString == null )
{
throw new Exception( " 无法获得配置文件中的连接字符串 " );
}
using (SqlConnection con = new SqlConnection(conString))
{
SqlCommand com = new SqlCommand(NProcName, con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue( " @tableName " , NTableName);
com.Parameters.AddWithValue( " @PageCurrent " , NPageCurrent);
com.Parameters.AddWithValue( " @PageSize " , NPageSize);
com.Parameters.AddWithValue( " @FieldShow " , NFieldShow);
com.Parameters.AddWithValue( " @FieldOrder " , NFieldOrder);
com.Parameters.AddWithValue( " @Where " , NWhere);
SqlParameter p = new SqlParameter( " @PageCount " , SqlDbType.Int);
p.Direction = ParameterDirection.Output;
com.Parameters.Add(p);
SqlDataAdapter ada = new SqlDataAdapter();
ada.SelectCommand = com;
DataTable table = new DataTable();
ada.Fill(table);
ViewState[ " count " ] = int .Parse(p.Value.ToString());
return table;
}
}
private void ButtonShow()
{
if (NPageCurrent <= 1 )
{
linkFirst.Enabled = false ;
linkPrevious.Enabled = false ;
imgFirst.Enabled = false ;
imgPrevious.Enabled = false ;
}
else
{
linkFirst.Enabled = true ;
linkPrevious.Enabled = true ;
imgFirst.Enabled = true ;
imgPrevious.Enabled = true ;
}
if (NPageCurrent >= NPageCount)
{
linkNext.Enabled = false ;
linkLast.Enabled = false ;
imgNext.Enabled = false ;
imgLast.Enabled = false ;
}
else
{
linkNext.Enabled = true ;
linkLast.Enabled = true ;
imgNext.Enabled = true ;
imgLast.Enabled = true ;
}
}
protected override void Render(HtmlTextWriter writer)
{
EnsureChildControls();
writer.AddAttribute(HtmlTextWriterAttribute.Width, this .Width.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Height, this .Height.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Bgcolor, " White " );
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.AddAttribute(HtmlTextWriterAttribute.Style, " font-size:12px " );
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
writer.AddAttribute(HtmlTextWriterAttribute.Align, " center " );
writer.AddAttribute(HtmlTextWriterAttribute.Valign, " Middle " );
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write( " 当前在 " + (NPageCurrent) + " / " + NPageCount + " 页 " );
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
if (NButtonType == ButtonType.ImageButton)
{
imgFirst.RenderControl(writer);
}
else
{
linkFirst.RenderControl(writer);
}
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
if (NButtonType == ButtonType.ImageButton)
{
imgPrevious.RenderControl(writer);
}
else
{
linkPrevious.RenderControl(writer);
}
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
if (NButtonType == ButtonType.LinkButton)
{
linkNext.RenderControl(writer);
}
else
{
imgNext.RenderControl(writer);
}
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Td);
if (NButtonType == ButtonType.LinkButton)
{
linkLast.RenderControl(writer);
}
else
{
imgLast.RenderControl(writer);
}
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Valign, " Middle " );
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write( " 转到 " );
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Valign, " Middle " );
writer.RenderBeginTag(HtmlTextWriterTag.Td);
dropvalue.RenderControl(writer);
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Valign, " Middle " );
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write( " 页 " );
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
#endregion
}
public enum ControlType
{
DataList,
GridView
}
public enum ButtonType
{
LinkButton,
ImageButton
}
}
存储过程
create PROC proc_Navigation
@tableName varchar( 100 ), -- 要分页显示的表名
@PageCurrent int = 1 , -- 要显示的页码
@PageSize int = 10 , -- 每页的大小(记录数)
@FieldShow nvarchar( 1000 ) = '' , -- 以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar( 1000 ) = '' , -- 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC / ASC,用于指定排序顺序
@Where nvarchar( 1000 ) = '' , -- 查询条件
@PageCount int output
as
SET XACT_ABORT ON -- 打开 try功能
BEGIN TRY -- 开启事务
begin tran
/**/ /* **(游标)获取表主键(多个用逗号分隔)** */
declare @keyName varchar(200 )
declare @name varchar( 200 )
set @keyName = ''
declare mycursor cursor
for
select column_name from information_schema.key_column_usage
where table_name = @tableName and constraint_name like ' PK_% '
open mycursor
fetch mycursor into @name
while @@fetch_status <>- 1
if @@fetch_status <>- 2
begin
set @keyName = @keyName + @name + ' , '
fetch mycursor into @name
end
close mycursor
deallocate mycursor
set @keyName = subString(@keyName, 1 ,len(@keyName) - 1 )
/**/ /* **设置要显示的字段** */
declare
@FieldShow1 varchar(1000 )
if len(@FieldShow) = 0
begin
set @FieldShow1 = ' * ' -- 输入的要显示的字段为空字符串时,设置为 *
end
else
begin
set @FieldShow1 = @FieldShow -- 将要显示的字段名赋值给变量@FieldShow1
end
/**/ /* **设置排序字段** */
declare
@FieldOrder1 varchar(100 )
if len(@FieldOrder) = 0
begin
set @FieldOrder1 = ''
end
else
begin
set @FieldOrder1 = ' order by ' + @FieldOrder
end
/**/ /* **设置where条件** */
declare
@where1 varchar(1000 )
if len(@Where) = 0
begin
set @where1 = ''
end
else
begin
set @where1 = ' where ' + @Where
end
/**/ /* **写分页sql语句** */
declare
@startnumber int , -- 开始行数
@endnumber int , -- 结束行数
@sql varchar( 5000 ) -- 分页SQL语句
set @startnumber = (@PageCurrent - 1 ) * @PageSize -- 根据每行页数和页数设置开始行数
set @endnumber = @PageCurrent * @PageSize -- 根据每行页数和页数设置结束行数 -- 主键名
set @sql =
' select * from (select row_number() over(order by ' +
@keyName+ ' ) row_num, ' +
@FieldShow1+ ' from ' +
@tableName+
@where1 + ' )tablename where row_num > ' +
convert(varchar(5 ),@startnumber) + ' and row_num <= ' +
convert(varchar(5 ),@endnumber) +
@FieldOrder1 -- 设置分页SQL语句
print @sql
exec (@sql)
/**/ /* **输出参数@PageCount** */
IF @PageCount IS NULL
BEGIN
DECLARE @text nvarchar(4000 )
SET @text = N ' SELECT @PageCount=COUNT(*) '
+ N ' FROM ' + @tableName
+ N ' ' + @where1
EXEC sp_executesql @text,N ' @PageCount int OUTPUT ' ,@PageCount OUTPUT
SET @PageCount = (@PageCount + @PageSize - 1 ) / @PageSize
END
commit tran -- 提交事务
print ' commited '
END TRY
BEGIN CATCH
rollback -- 事务回滚
print ' rolled back '
END CATCH
go
declare @a int
exec proc_Navigation ' aa ' , 1 , 8 , '' , '' , '' ,@a output
print @a
, 这个送给你!
posted on
2008-07-10 10:38
︷起↘嚸.
阅读(
301 )
评论()
收藏
举报