web自定义控件(超高技术问题,进来看看能说得不少)
程序如下:
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;
namespace GoldSoft.OA.UIControl.FenYe
{
[DefaultProperty("Test")]
[ToolboxData("<{0}:DataGridFenYe runat=server></{0}:DataGridFenYe>")]
public class DataGridFenYe : System.Web.UI.WebControls.DataGrid
{
private Panel FenYeQuYu = new Panel();
private Label PagerCounts = new Label();
private Label PageIndex = new Label();
private Label Total = new Label();
private LinkButton LbZuiQianYe = new LinkButton();
private LinkButton LbShangYiYe = new LinkButton();
private LinkButton LbXiaYiYe = new LinkButton();
private LinkButton LbZuiHouYe = new LinkButton();
private ImageButton FirstPage = new ImageButton();
private ImageButton UpperPage = new ImageButton();
private ImageButton LastPage = new ImageButton();
private ImageButton NextPage = new ImageButton();
private string firstPageImage;
private string upperPageImage;
private string lastPageImage;
private string nextPageIamge;
private DropDownList ddl = new DropDownList();
private ButtonSortEnum buttonSort;
protected static DataTable _dataSource = new DataTable();
#region 构造器
public DataGridFenYe()
{
//_dataSource = null;
this.AllowPaging = true;
this.AutoGenerateColumns = false;
this.firstPageImage = "Image/first.gif";
this.upperPageImage = "Image/upper.gif";
this.lastPageImage = "Image/last.gif";
this.nextPageIamge = "Image/next.gif";
this.ddl.AutoPostBack = true;
this.PagerCounts.Font.Size = new FontUnit(9);
this.PageIndex.Font.Size = new FontUnit(9);
this.Total.Font.Size = new FontUnit(9);
this.LbZuiQianYe.Text = "最前页";
this.LbZuiQianYe.Font.Size = new FontUnit(9);
this.LbZuiQianYe.Enabled = true;
this.LbShangYiYe.Text = "上一页";
this.LbShangYiYe.Font.Size = new FontUnit(9);
this.LbXiaYiYe.Text = "下一页";
this.LbXiaYiYe.Font.Size = new FontUnit(9);
this.LbZuiHouYe.Text = "最后页";
this.LbZuiHouYe.Font.Size = new FontUnit(9);
switch (this.ButtonSort) //判断选择导航按扭类型
{
case ButtonSortEnum.LinkButton://用LinkButton导型,即“第一页“,“下一页“之类的
this.PagerStyle.Visible = false;
//把LinkButton加入FenYeQuYu容器中
this.FenYeQuYu.Controls.Add(PageIndex);
this.FenYeQuYu.Controls.Add(PagerCounts);
this.FenYeQuYu.Controls.Add(Total);
this.FenYeQuYu.Controls.Add(LbZuiQianYe);
this.FenYeQuYu.Controls.Add(LbShangYiYe);
this.FenYeQuYu.Controls.Add(LbXiaYiYe);
this.FenYeQuYu.Controls.Add(LbZuiHouYe);
break;
case ButtonSortEnum.Number://数子导航此处是开启了datagrid自带的DataGrid数字导航功能
this.AllowPaging = true;
this.ShowFooter = true;
this.PagerStyle.Visible = true;
this.PagerStyle.Mode = PagerMode.NumericPages;
break;
case ButtonSortEnum.ImageButton://图片按扭导航
this.PagerStyle.Visible = false;
//把图片按钮加入FenYeQuYu容器中
this.FenYeQuYu.Controls.Add(PageIndex);
this.FenYeQuYu.Controls.Add(PagerCounts);
this.FenYeQuYu.Controls.Add(Total);
this.FenYeQuYu.Controls.Add(FirstPage);
this.FenYeQuYu.Controls.Add(NextPage);
this.FenYeQuYu.Controls.Add(UpperPage);
this.FenYeQuYu.Controls.Add(LastPage);
break;
}
this.FenYeQuYu.Controls.Add(ddl);
this.ItemCreated += new DataGridItemEventHandler(DataGrid_ItemCreated);
}
问题点数:50、回复次数:5Top
1 楼ivan973(湘平)回复于 2006-10-09 21:59:34 得分 0
#endregion
#region 属 性
/// <summary>
/// 获取或者设置数据源
/// </summary>
[Bindable(true),
Category("Appearance"),
Browsable(false),
Description("数据源")]
public DataTable _DataSource
{
get
{
return _dataSource;
}
set
{
_dataSource = value;
}
}
/// 获取或者设置第一页图片按钮对应的图片路径
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("Image/first.gif"),
Description("第一页图片按钮对应的图片路径")]
public string FirstPageImage
{
get
{
return firstPageImage;
}
set
{
firstPageImage = value;
}
}
/// <summary>
/// 获取或者设置上一页图片按钮对应的图片路径
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("Image/upper.gif"),
Description("上一页图片按钮对应的图片路径")]
public string UpperPageImage
{
get
{
return upperPageImage;
}
set
{
upperPageImage = value;
}
}
/// <summary>
/// 获取或者设置最后一页图片按钮对应的图片路径
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("Image/last.gif"),
Description("最后一页图片按钮对应的图片路径")]
public string LastPageImage
{
get
{
return lastPageImage;
}
set
{
lastPageImage = value;
}
}
/// <summary>
/// 获取或者设置下一页图片按钮对应的图片路径
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("Image/next.gif"),
Description("下一页图片按钮对应的图片路径")]
public string NextPageIamge
{
get
{
return nextPageIamge;
}
set
{
nextPageIamge = value;
}
}
/// <summary>
/// 获取或者设置分页按钮的类型
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("ImageButton"),
Description("获取或者设置分页按钮的类型")]
public ButtonSortEnum ButtonSort
{
get
{
return this.buttonSort;
}
set
{
this.buttonSort = value;
}
}
#endregion
#region 方 法
public void BindData()
{
this.DataSource = _DataSource;
this.DataBind();
int TotalNum = this._DataSource.Rows.Count;
int PageNum = TotalNum / this.PageSize;
if (TotalNum % this.PageSize > 0)
{
PageNum++;
}
PageIndex.Text = "当前为第:" + Convert.ToString(this.CurrentPageIndex + 1) + "页/";
PagerCounts.Text = "共有" + PageNum.ToString() + "页/";
Total.Text = "共有 " + TotalNum.ToString() + "条记录";
ddl.Items.Clear();
for (int i = 1; i <= PageNum; i++)
{
ddl.Items.Add(new ListItem("第" + i.ToString() + "页", i.ToString()));
}
ddl.SelectedIndex = this.CurrentPageIndex;
}
#endregionTop
2 楼ivan973(湘平)回复于 2006-10-09 22:00:12 得分 0
#region DDl事件
/// <summary>
/// 转到指定页数事件
/// </summary>
/// <param name="output"></param>
private void ddlSelectPage_SelectedIndexChanged(object sender, System.EventArgs e)
{
int NoPage = Convert.ToInt32(ddl.SelectedItem.Value);
this.CurrentPageIndex = NoPage - 1;
BindData();
}
#endregion
protected void DataGrid_ItemCreated(object sender, DataGridItemEventArgs e)
{
//下面语句是在datagrid最下面加一行,把导航控件封装到DataGrid里去同事为导般控件加入委托事件
if (e.Item.ItemType == ListItemType.Pager)
{
TableCell tc = (TableCell)e.Item.Cells[0];
tc.Controls.Clear();
tc.Controls.Add(this.FenYeQuYu);
tc.HorizontalAlign = HorizontalAlign.Right;
tc.VerticalAlign = VerticalAlign.Middle;
if (this.ButtonSort == ButtonSortEnum.LinkButton)
{
LinkButton lbFirst = (LinkButton)tc.Controls[0].Controls[3];//第一页事件委托
lbFirst.Click += new EventHandler(lbFirst_Click);
LinkButton lbUpperPage = (LinkButton)tc.Controls[0].Controls[4];//上一页事件委托
lbUpperPage.Click += new EventHandler(lbUpperPage_Click);
LinkButton lbNext = (LinkButton)tc.Controls[0].Controls[5];//下一页事件委托
lbNext.Click += new EventHandler(lbNextPage_Click);
LinkButton lbLast = (LinkButton)tc.Controls[0].Controls[6];//最后一页事件委托
lbLast.Click += new EventHandler(lbLastPage_Click);
DropDownList ddlSelectPage = (DropDownList)tc.Controls[0].Controls[7];
}
if (this.buttonSort == ButtonSortEnum.ImageButton)
{
ImageButton imbtnFirstPage = (ImageButton)tc.Controls[0].Controls[3];
imbtnFirstPage.Click += new ImageClickEventHandler(imbtnFirstPage_Click);
ImageButton imbtnNextPage = (ImageButton) tc.Controls[0].Controls[4];
imbtnNextPage.Click += new ImageClickEventHandler(imbtnNextPage_Click);
ImageButton imbtnUpper = (ImageButton)tc.Controls[0].Controls[5];
imbtnUpper.Click += new ImageClickEventHandler(imbtnUpperPage_Click);
ImageButton imbtnLastPage = (ImageButton)tc.Controls[0].Controls[6];
imbtnLastPage.Click += new ImageClickEventHandler(imbtnLastPage_Click);
}
ddl.SelectedIndexChanged += new EventHandler(ddlSelectPage_SelectedIndexChanged);
}
}
#region LinkButton 事 件
/// <summary>
/// "第一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbFirst_Click(object sender, EventArgs e)
{
this.CurrentPageIndex = 0; //到第一页
BindData();
}
/// <summary>
/// "上一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbUpperPage_Click(object sender, EventArgs e)
{
if (this.CurrentPageIndex > 0) //上一页
{
this.CurrentPageIndex = this.CurrentPageIndex - 1;
BindData();
}
}
/// <summary>
/// "下一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbNextPage_Click(object sender, EventArgs e)
{
if (this.CurrentPageIndex < this.PageCount - 1) //下一页
{
this.CurrentPageIndex = this.CurrentPageIndex + 1;
BindData();
}
}
/// <summary>
/// "最后一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbLastPage_Click(object sender, EventArgs e)
{
this.CurrentPageIndex = this.PageCount - 1; //最后页
BindData();
}
#endregion
#region ImageButton事件
/// <summary>
/// "第一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void imbtnFirstPage_Click(object sender, ImageClickEventArgs e)
{
this.CurrentPageIndex = 0;
BindData();
}
/// <summary>
/// "下一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void imbtnNextPage_Click(object sender, ImageClickEventArgs e)
{
if (this.CurrentPageIndex < this.PageCount - 1)
{
this.CurrentPageIndex = this.CurrentPageIndex + 1;
BindData();
}
}
/// <summary>
/// "最后一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void imbtnLastPage_Click(object sender, ImageClickEventArgs e)
{
this.CurrentPageIndex = this.PageCount - 1;
BindData();
}
/// <summary>
/// "上一页"事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void imbtnUpperPage_Click(object sender, ImageClickEventArgs e)
{
if (this.CurrentPageIndex > 0)
{
this.CurrentPageIndex = this.CurrentPageIndex - 1;
BindData();
}
}
#endregion
#region 呈 现
protected override void Render(HtmlTextWriter writer)
{
//this.RenderContents(writer);
base.Render(writer);
try
{
this.FenYeQuYu.RenderControl(writer);
}
catch { }
}
#endregion
}
public enum ButtonSortEnum
{
ImageButton = 0,
LinkButton = 1,
Number = 2
}
}Top
3 楼ivan973(湘平)回复于 2006-10-09 22:00:38 得分 0
控件要求的功能是: 将数据源邦定到此控件,可以用导航按扭实现上一页,下一页(即分页)。并且控件的导航按钮可以是图片(ImageButton),文字式(LinkButton),数子式
整个控件设计思路是:继承DataGrid控件,然后加入导航所需按钮(ImageButton,LinkButton)把这此按钮加入FenYeQuYu容器中,然后再在继承的DataGrid控件最后面加入一类行为TableCell 的一行,再把
FenYeQuYu中的控件加入这一行中.并为之产生委托事件.
现在控件出现的问题是:1:如果在构造成函数中没给_dataSource 赋初值时,把控件托放到页面并为之添加邦定字段后,为报“创建控件出错",但如你到HTML里把该控件的__DataSource=""标记去掉,控件又恢复正常,并能邦定数据显示。
2:在显于数据后,点击导航按钮,页数是按二增减。即当前页为“第一页”时,按“下一页”,就跳到第三页去了。我跟踪了一下发现,当点击导航按钮时里面的所友代码都被值行了两次.不知为什么
3:在设置自定义属性ButtonSort即导航按钮类型时,属性没启做用,控件总是获取枚举类弄第一个值,属性设置不起做用.并且ImageButton得不到图片属性
内容是有点多,但看明白了其实很简单的 希望哪位好心人能帮帮我,不胜感激。如哪位有更好的分页控件(导航按钮和DataGrid是一个整体邦在一起的那种),拿出来分享一下,小弟在这里先谢了.苦苦等待中……………………………………………………………………Top
4 楼xuwei(夕阳西下,断肠人在天涯)回复于 2006-10-09 22:01:14 得分 0
你就不能说说重点,
一大堆代码贴出来,
头都昏了!Top
5 楼ivan973(湘平)回复于 2006-10-10 09:45:27 得分 0
重点说了啊
控件要求的功能是: 将数据源邦定到此控件,可以用导航按扭实现上一页,下一页(即分页)。并且控件的导航按钮可以是图片(ImageButton),文字式(LinkButton),数子式
整个控件设计思路是:继承DataGrid控件,然后加入导航所需按钮(ImageButton,LinkButton)把这此按钮加入FenYeQuYu容器中,然后再在继承的DataGrid控件最后面加入一类行为TableCell 的一行,再把
FenYeQuYu中的控件加入这一行中.并为之产生委托事件.
现在控件出现的问题是:1:如果在构造成函数中没给_dataSource 赋初值时,把控件托放到页面并为之添加邦定字段后,为报“创建控件出错",但如你到HTML里把该控件的__DataSource=""标记去掉,控件又恢复正常,并能邦定数据显示。
2:在显于数据后,点击导航按钮,页数是按二增减。即当前页为“第一页”时,按“下一页”,就跳到第三页去了。我跟踪了一下发现,当点击导航按钮时里面的所友代码都被值行了两次.不知为什么
3:在设置自定义属性ButtonSort即导航按钮类型时,属性没启做用,控件总是获取枚举类弄第一个值,属性设置不起做用.并且ImageButton得不到图片属性
Top



