[分享]重写Repeater带分页、全选反选两按钮事件

闲游四疯 2010-08-20 08:40:39
基本功能已实现,需其它功能可自己扩展源码
有疑问 加QQ新群 9997621 欢迎技术交流

using System;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Collections.Generic;

namespace DYXue.WebControls
{
[ToolboxData("<{0}:PageRepeater runat=server></{0}:PageRepeater>")]
public class RepeaterPager : Repeater, IPostBackEventHandler
{
#region 数据绑定

/// <summary>
/// 绑定数据非当前页数据时使用此方法[如直接返回DataSet,DataTable,DataView]
/// </summary>
/// <param name="e">数据</param>
public void SetDataSource(object source)
{
PagedDataSource pds = new PagedDataSource();
pds.DataSource = getResolvedDataSource(source);
pds.AllowPaging = true;
pds.PageSize = PageSize;
pds.CurrentPageIndex = PageIndex - 1;
RecordCount = pds.DataSourceCount;

this.DataSource = pds;
this.DataBind();
}
/// <summary>
/// 绑定当前页数据时使用此方法[IList之类的]
/// </summary>
/// <param name="e">数据</param>
/// <param name="sum">总纪录数</param>
public void SetDataSource(object source, int sum)
{
RecordCount = sum;

this.DataSource = getResolvedDataSource(source);
this.DataBind();
}
/// <summary>
/// 数据类型转换
/// </summary>
/// <param name="source">数据</param>
/// <returns></returns>
private IEnumerable getResolvedDataSource(object source)
{
if (source is IEnumerable)
return (IEnumerable)source;
else if (source is IList)
return (IEnumerable)source;
else if (source is DataView)
return (IEnumerable)source;
else if (source is DataSet)
return (IEnumerable)(((DataSet)source).Tables[0].DefaultView);
else if (source is DataTable)
return (IEnumerable)(((DataTable)source).DefaultView);
else
return null;
}

#endregion

#region Url输出页面代码
/// <summary>
/// 输出控件[全选反选注意添加jquery文件]
/// </summary>
protected override void Render(HtmlTextWriter writer)
{
writer.Write("\r\n<div id=\"RepeaterDiv\">");

base.Render(writer);

writer.Write("<table style=\"width:100%;\">");
writer.Write("<tr>");
writer.Write("<td align=\"left\">");

writer.Write("<input type=\"button\" value=\"全选\" onclick='$(\"input:checkbox\",$(\"#RepeaterDiv\")).each(function(){$(this).attr(\"checked\", true);});' />");

writer.Write(" ");

writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
writer.AddAttribute(HtmlTextWriterAttribute.Value, "反选");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "$(\"input:checkbox\",$(\"#RepeaterDiv\")).each(function(){$(this).attr(\"checked\", !this.checked);});");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();

writer.Write(" ");

writer.Write("<input type=\"button\" onclick=\"{0}\" value=\"保存选中\">",
Page.ClientScript.GetPostBackEventReference(this, "SAVE"));

writer.Write(" ");

writer.Write("<input type=\"button\" onclick=\"{0}\" value=\"删除选中\">",
Page.ClientScript.GetPostBackEventReference(this, "DELETE"));

writer.Write("</td>");
writer.Write("<td align=\"right\">");

writer.Write(GetPage());

writer.Write("</td>");
writer.Write("</tr>");
writer.Write("</table>");
writer.Write("</div>\r\n");
}

/// <summary>
/// 返回分页HTML代码
/// </summary>
private string GetPage()
{
if (AlwaysPage == false)
RecordCount = PageSize = this.Items.Count;

if (PageCount == 1 && AlwaysShow == false)
return string.Empty;

StringBuilder builder = new StringBuilder();

string s1 = string.Empty;
string s2 = string.Empty;
string s3 = string.Empty;
string s4 = string.Empty;

string _a;
string _a1;
string _a2;

if (IsOrNoPostBack == true)
{
_a = "<a href=\"javascript:__doPostBack('" + this.UniqueID + "','{0}')\" >{1}</a>";
_a1 = "<a href=\"javascript:__doPostBack('" + this.UniqueID + "','{0}')\" >{1}...</a>";
_a2 = "<a href=\"javascript:__doPostBack('" + this.UniqueID + "','{0}')\" >...{1}</a>";
}
else
{
string _url = GetUrl();
_a = "<a href=\"" + _url + "\" >{1}</a>";
_a1 = "<a href=\"" + _url + "\" >{1}...</a>";
_a2 = "<a href=\"" + _url + "\" >...{1}</a>";
}

if (PageCount > 1)
{
if (PageIndex == 1)
{
s3 = string.Format(_a2, PageCount, PageCount);
s4 = string.Format(_a, PageIndex + 1, NextPageText);
}
else if (PageIndex == PageCount)
{
s1 = string.Format(_a, PageIndex - 1, PrevPageText);
s2 += string.Format(_a1, 1, 1);
}
else
{
s1 = string.Format(_a, PageIndex - 1, PrevPageText);
s2 = string.Format(_a1, 1, 1);
s3 = string.Format(_a2, PageCount, PageCount);
s4 = string.Format(_a, PageIndex + 1, NextPageText);
}
}

IList<int> list = new List<int>();

if (PageCount < Numbercount)
{
for (int i = 1; i <= PageCount; i++)
{
if (i == PageIndex)
builder.Append(PageIndex);
else
builder.AppendFormat(_a, i, i);
list.Add(i);
}
}
else if (PageIndex + Numbercount / 2 > PageCount)
{
for (int i = PageCount - Numbercount + 1; i <= PageCount; i++)
{
if (i == PageIndex)
builder.Append(PageIndex);
else
builder.AppendFormat(_a, i, i);
list.Add(i);
}
}
else
{
int k = PageIndex - Numbercount / 2 - 1;

if (k < 0)
{
k = 0;
}

for (int i = 1; i <= Numbercount; i++)
{
if (k + i == PageIndex)
builder.Append(PageIndex);
else
builder.AppendFormat(_a, k + i, k + i);
list.Add(k + i);
}
}

if (list.Contains(1))
s2 = string.Empty;

if (list.Contains(PageCount))
s3 = string.Empty;

return s1 + s2 + builder.ToString() + s3 + s4;
}

/// <summary>
/// 获取分页链接Url
/// </summary>
/// <returns></returns>
private string GetUrl()
{
NameValueCollection col = new NameValueCollection(Context.Request.QueryString);

col.Remove("page");

string _baseQuery = String.Empty;

if (col.AllKeys.Length > 0)
{
string[] parms = new string[col.AllKeys.Length];

for (int i = 0; i < col.AllKeys.Length; i++)
{
parms[i] = String.Format("{0}={1}", col.AllKeys[i], col[col.AllKeys[i]]);
}

_baseQuery = String.Join("&", parms);
}

StringBuilder url = new StringBuilder();
url.Append(Context.Request.Url.AbsolutePath);
url.Append("?page={0}");

if (!String.IsNullOrEmpty(_baseQuery))
{
url.Append("&");
url.Append(_baseQuery);
}
return url.ToString();
}
#endregion

#region IPostBackEventHandler 成员 [ 回发必须 ]

public event EventHandler EventSave;
public event EventHandler EventDelete;
public event EventHandler EventPage;

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
switch (eventArgument.ToUpper())
{
case "SAVE":
if (EventSave != null)
EventSave(this, EventArgs.Empty);
break;
case "DELETE":
if (EventDelete != null)
EventDelete(this, EventArgs.Empty);
break;
default:
if (IsOrNoPostBack == true)
{
PageIndex = Int32.Parse(eventArgument);

if (EventPage != null)
EventPage(this, EventArgs.Empty);
}
break;
}
}

#endregion


...全文
572 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
自强不熄 2010-11-21
  • 打赏
  • 举报
回复
LUGUO,支持一下
wilensky 2010-09-19
  • 打赏
  • 举报
回复
mark
Dzhilin 2010-09-17
  • 打赏
  • 举报
回复
非常好的东西,学习了。
凤矶 2010-08-20
  • 打赏
  • 举报
回复
头回仔细看,原来国米的徽 是 MFC 。哈哈。
PandaIT 2010-08-20
  • 打赏
  • 举报
回复
。。。学习!
mjfei 2010-08-20
  • 打赏
  • 举报
回复
顶一下下,收藏,学习!

另谢谢LZ
sh_suyuelin 2010-08-20
  • 打赏
  • 举报
回复
LZ好人
zhanglc1125 2010-08-20
  • 打赏
  • 举报
回复
thank you
zakumiwb 2010-08-20
  • 打赏
  • 举报
回复
yzf86211861 2010-08-20
  • 打赏
  • 举报
回复
谢谢分享 学习
离洛 2010-08-20
  • 打赏
  • 举报
回复
学习;顶LZ!
闲游四疯 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sj6071 的回复:]
呵呵,最好把分页取数据那块优化下,不然数据多了就很慢了,
[/Quote]
我不知道怎么优化 是缓存还是什么
有没有参考例子吗?
sj6071 2010-08-20
  • 打赏
  • 举报
回复
呵呵,最好把分页取数据那块优化下,不然数据多了就很慢了,
fenshm 2010-08-20
  • 打赏
  • 举报
回复
学习、收藏!
V-Far 2010-08-20
  • 打赏
  • 举报
回复
好东西经常会看到.嘿嘿
mark620 2010-08-20
  • 打赏
  • 举报
回复
恩 这个经常会用到的。
a365477312 2010-08-20
  • 打赏
  • 举报
回复
支持LZ,LZ真是个大好人。
sunnj87 2010-08-20
  • 打赏
  • 举报
回复
支持下!
thanktheworld 2010-08-20
  • 打赏
  • 举报
回复
楼主不错啊,既给代码又给分,难得一见的好人。
porschev 2010-08-20
  • 打赏
  • 举报
回复
先存下。。。谢谢分享
加载更多回复(17)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧