手动分页我已经实现,是手动插入分页符号$page$
但是自动分页还没有实现
我是想在多少个字符串后面加个$page$,但是不要隔开html标记,还要保留html标记!
但是自动分页还没有实现
我是想在多少个字符串后面加个$page$,但是不要隔开html标记,还要保留html标记!
解决方案 »
- vs2008 javascript问题
- 文本框鼠标放置文字消失的效果
- webform显示的问题,看大家有没有好办法!
- javascript小问题!
- .net里的数据库处理是非连接数据吗?什么叫非连接数据?
- 一个关于字符编码在安装部署时奇怪的问题,寻求高手的帮助
- 郁闷阿! Infragistics NetAdvantage 自带Sample的问题
- 如何在服务端得到DataGrid中TextBox到客户端的name呢?
- 我用ASP.NET(C#)写了个发邮件程序,调试时有一个错误。
- 工程写完后,删掉了所有垃圾文件,只留下webform1.aspx和webform1.aspx.vb
- sql server 中 关于update 会覆盖数据的问题。
- 一个修改DLL的疑惑
using System.Data;
using System.Configuration;
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;
using System.ComponentModel;namespace _GNewsSysWeb
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:PagerControl runat=server></{0}:PagerControl>")]
public class PagerControl : WebControl
{ private int currentPage; // 当前页的页码
private int pageCount; // 总页数 private bool showPrevious = false; // 是否显示 上一页、第一页 的链接
private bool showNext = false; // 是否显示 下一页、最末页 的链接 private int startPage; // 显示的第一页 的 页码
private int endPage; // 显示的最末页 的 页码 public PagerControl()
{
// 当前页之前可以显示的最多链接数,大于此条链接将被隐藏
ViewState["PreviousPageCount"] = 5; // 当前页之后可以显示的最多链接数,大于此条链接将被隐藏
ViewState["AfterPageCount"] = 4; // 供客户端设置样式
ViewState["CssClass"] = "Pager";
} public new string CssClass
{
get { return ViewState["CssClass"].ToString(); }
set { ViewState["CssClass"] = value; }
} public int PreviousPageCount
{
get { return (int)ViewState["PreviousPageCount"]; }
set { ViewState["PreviousPageCount"] = value; }
} public int AfterPageCount
{
get { return (int)ViewState["AfterPageCount"]; }
set { ViewState["AfterPageCount"] = value; }
} public UrlManager UrlManager
{
get { return (UrlManager)ViewState["UrlManager"]; }
set { ViewState["UrlManager"] = value; }
} // 添加“第一页”,“上一页”的连接
private void AddPreviousLink(UrlManager UrlManager, HtmlTextWriter output)
{ output.AddAttribute(HtmlTextWriterAttribute.Class, "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title, "第一页");
output.AddAttribute(HtmlTextWriterAttribute.Href, UrlManager.GetPageUrl(1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write("<<");
output.RenderEndTag(); output.AddAttribute(HtmlTextWriterAttribute.Class, "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title, "上一页");
output.AddAttribute(HtmlTextWriterAttribute.Href, UrlManager.GetPageUrl(currentPage - 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write("<");
output.RenderEndTag(); showPrevious = false; // 只显示一次
}
// 添加 “下一页”、“最末页” 的链接
private void AddNextLink(UrlManager UrlManager, HtmlTextWriter output)
{ output.AddAttribute(HtmlTextWriterAttribute.Class, "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title, "下一页");
output.AddAttribute(HtmlTextWriterAttribute.Href, UrlManager.GetPageUrl(currentPage + 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(">");
output.RenderEndTag(); output.AddAttribute(HtmlTextWriterAttribute.Class, "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title, "最末页");
output.AddAttribute(HtmlTextWriterAttribute.Href, UrlManager.GetPageUrl(pageCount));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(">>");
output.RenderEndTag(); showNext = false; // 可有可无,程序会跳出循环
}
// 根据当前页,当前页之前可以显示的页数,算得从第几页开始进行显示
private void SetStartPage()
{ // 如果当前页小于它前面所可以显示的条目数,
// 那么显示第一页就是实际的第一页
if (currentPage <= PreviousPageCount)
{
startPage = 1;
}
else
// 这种情况下 currentPage 前面总是能显示完,
// 要根据后面的长短确定是不是前面应该多显示
{
if (currentPage > PreviousPageCount + 1)
showPrevious = true; int linkLength = (pageCount - currentPage + 1) + PreviousPageCount; int startPage = currentPage - PreviousPageCount; while (linkLength < PreviousPageCount + AfterPageCount + 1 && startPage > 1)
{
linkLength++;
startPage--;
} this.startPage = startPage;
}
} // 根据CurrentPage、总页数、当前页之后长度 算得显示的最末页是 第几页
private void SetEndPage()
{
// 如果当前页加上它之后可以显示的页数 大于 总页数,
// 那么显示的最末页就是实际的最末页
if (currentPage + AfterPageCount >= pageCount)
{
endPage = pageCount;
}
else
{ // 这种情况下 currentPage后面的总是可以显示完,
// 要根据前面的长短确定是不是后面应该多显示 int linkLength = (currentPage - startPage + 1) + AfterPageCount; int endPage = currentPage + AfterPageCount; while (linkLength < PreviousPageCount + AfterPageCount + 1 && endPage < pageCount)
{
linkLength++;
endPage++;
} if (endPage < pageCount)
showNext = true; this.endPage = endPage;
}
}
// 显示在页面上
protected override void Render(HtmlTextWriter output)
{ output.AddAttribute(HtmlTextWriterAttribute.Class, CssClass);
output.RenderBeginTag(HtmlTextWriterTag.Div); if (UrlManager == null)
throw new ArgumentNullException("UrlManager 不能为 Null"); // 获取当前页
currentPage = UrlManager.CurrentPageIndex; // 获取总页数
pageCount = UrlManager.PageCount; SetStartPage();
SetEndPage(); // 循环打印链接
for (int i = startPage; i <= endPage; i++)
{
if (showPrevious) // 如果需要显示前一页、第一页链接
AddPreviousLink(UrlManager, output);
if (i == currentPage)
{
output.AddAttribute(HtmlTextWriterAttribute.Class, "CurrentPage");
} output.AddAttribute(HtmlTextWriterAttribute.Href, UrlManager.GetPageUrl(i));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(i);
output.RenderEndTag(); // A if (i == endPage && showNext) // 如果需要显示 下一页、最末页 链接
AddNextLink(UrlManager, output);
} output.RenderBeginTag(HtmlTextWriterTag.Span);
output.Write(String.Format(" ( 第<b>{0}</b>页/共<b>{1}</b>页 )", currentPage, pageCount));
output.RenderEndTag(); // Span output.RenderEndTag(); // Div
} }
}
或通过正则获取HTML标记,替换为分隔符
自动的话,不是很职能的
如果漏掉一个HTML不闭合的话,就有可能变形的
/// 插入分割标签
/// </summary>
/// <param name="strText">打算插入标签的内容</param>
/// <param name="maxPagesize">自动插入标签的最大字符长度</param>
/// <param name="Pagebreak">分页符</param>
/// <returns></returns>
private static string InsertPageBreak(string strText, int maxPagesize, string Pagebreak)
{
if (maxPagesize == 0 || string.IsNullOrEmpty(strText) || strText.IndexOf(Pagebreak) != -1) return strText;
string s = strText;
int sl = s.Length;
bool IsCount = true;
string Temp_String = "";
string strTemp = "";
string c = "";
int iCount = 0;
string[] Temp_Array;
string ss = "";
if (sl < Int32.Parse((maxPagesize + maxPagesize / 3).ToString()))
{
return s;
}
s = s.Replace(" ", "< >");
s = s.Replace(">", "<>>");
s = s.Replace("<", "<<>");
s = s.Replace(""", "<">");
s = s.Replace("'", "<'>");
IsCount = true;
Temp_String = ""; for (int i = 0; i < sl; i++)
{
c = s.Substring(i, 1);
if (c == "<")
{
IsCount = false;
}
else if (c == ">")
{
IsCount = true;
}
else
{
if (IsCount)
{
if (System.Text.RegularExpressions.Regex.IsMatch(c, "[\u4e00-\u9fa5]", System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
iCount += 2;
}
else
{
iCount += 1;
}
if (iCount > maxPagesize && i < sl)
{
strTemp = s.Substring(0, i);
if (CheckPagination(strTemp, "table|a|b>|i>|strong|div|span"))
{
Temp_String += i.ToString() + ",";
iCount = 0;
}
}
}
}
}
if (Temp_String.Length > 1)
{
Temp_String = Temp_String.TrimEnd(',');
}
Temp_Array = Temp_String.Split(',');
int l = Temp_Array.Length;
if (Temp_Array.Length > 0)
{
for (int j = l - 1; j >= 0; j--)
{
ss = s.Substring(Int32.Parse(Temp_Array[j].ToString()));
s = s.Substring(0, Int32.Parse(Temp_Array[j].ToString())) + Pagebreak + ss;
}
}
s = s.Replace("< >", " ");
s = s.Replace("<>>", ">");
s = s.Replace("<<>", "<");
s = s.Replace("<">", """);
s = s.Replace("<'>", "'");
return s;
}
/// <summary>
/// 检测内容标签闭合情况
/// </summary>
/// <param name="strTemp">打算检测的字符</param>
/// <param name="strFind">打算检查闭合情况的标签集合</param>
/// <returns></returns>
private static bool CheckPagination(string strTemp, string strFind)
{
strTemp = strTemp.ToLower();
strFind = strFind.ToLower();
string[] FindArray;
string m_strBegin, m_strEnd;
int n = 0, m_intEndNum = 0, m_ingBeginNum = 0;
if (strTemp != "" && strFind != "")
{
FindArray = strFind.Split('|');
int cl = FindArray.Length;
int cc = 0;
while (cc < cl)
{
m_strBegin = "<" + FindArray[cc];
m_strEnd = "</" + FindArray[cc];
n = 0;
while (strTemp.IndexOf(m_strBegin, n + 1) > -1)//不知道对不对
{
n = strTemp.IndexOf(m_strBegin, n + 1);
m_ingBeginNum += 1;
}
n = 0;
while (strTemp.IndexOf(m_strEnd, n + 1) > -1)//不知道对不对
{
n = strTemp.IndexOf(m_strEnd, n + 1);
m_intEndNum += 1;
}
cc++;
if (m_intEndNum == m_ingBeginNum)
{
return true;
}
else
{
return false;
}
}
}
else
{
return false;
}
return false;
}
}
然后分就行了。
下面是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Text.RegularExpressions;
public partial class news_Default : System.Web.UI.Page
{ public string strTitle = ""; protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{ int fid = 1;
if (Request.QueryString["id"] != null)
{
string strid = Request.QueryString["id"].ToString();
fid = int.Parse(strid);
}
Entity.Library.Developments ty = new Entity.Library.Developments();
Query.Library.DevelopmentsQuery qd = new Query.Library.DevelopmentsQuery(ty);
var develo = qd.GetTable("8");
var querys = from m in develo select m;
if (querys.Count() > 0)
{
strTitle = querys.Max(m => m.Titles).ToString();
Label1.Text = strTitle;
Label2.Text = querys.Max(m => m.Datetimes).ToString();
Label3.Text = querys.Max(m => m.Sorts).ToString();
Label4.Text = OutputBySize(Server.HtmlDecode(Common.Library.Share.HtmlDiscode(querys.Max(m => m.Contents).ToString())), fid);
// Label4.Text =Common.Library.Share.HtmlDiscode( querys.Max(m => m.Contents).ToString());
// Label4.Text = RegSubHtm(Server.HtmlDecode(Common.Library.Share.HtmlDiscode( querys.Max(m => m.Contents).ToString())));
DataBind();
}
}
} public string OutputBySize(string p_strContent, int pageid)
{
string m_strRet = p_strContent;
int m_intPageSize = 1000;//文章每页大小
int m_intCurrentPage = 1;//设置第一页为初始页
int m_intTotalPage = 0;
int m_intArticlelength = p_strContent.Length;//文章长度
if (m_intPageSize < m_intArticlelength)
{//如果每页大小大于文章长度时就不用分页了
if (m_intArticlelength % m_intPageSize == 0)
{//set total pages count
m_intTotalPage = m_intArticlelength / m_intPageSize;
}
else
{//if the totalsize
m_intTotalPage = m_intArticlelength / m_intPageSize + 1;
}
if (Request.QueryString["pages"] != null)
{//set Current page number
try
{//处理不正常的地址栏的值
m_intCurrentPage = Convert.ToInt32(Request.QueryString["pages"]);
if (m_intCurrentPage > m_intTotalPage)
m_intCurrentPage = m_intTotalPage;
}
catch
{ } }
//set the page content 设置获取当前页的大小
m_intPageSize = m_intCurrentPage < m_intTotalPage ? m_intPageSize : (m_intArticlelength - m_intPageSize * (m_intCurrentPage - 1));
m_strRet = p_strContent.Substring(m_intPageSize * (m_intCurrentPage - 1), m_intPageSize);
string m_strPageInfo = "<p></p>";
for (int i = 1; i <= m_intTotalPage; i++)
{
if (i == m_intCurrentPage)
m_strPageInfo += "<b>" + i + "</b>|";
else
m_strPageInfo += "<a href=Default.aspx?id=" + pageid + "&pages=" + i + ">" + i + "</a>|";
}
//输出显示各个页码
this.labPageNumber.Text = RegSubHtm(m_strPageInfo);
}
return m_strRet;
}
private string RegSubHtm(string html)
{
string subHtml = html;//html.Substring(0, length);
// MessageBox.Show("subHtml:" + subHtml); int length
//判断被截取的html最后部分时候包含没有闭合的标签,如"</tb" "<div id="
bool isTagOpen = false;
foreach (char c in subHtml.ToCharArray().Reverse())
{
if (c == '<')
{
isTagOpen = true;
break;
} if (c == '>')
{
isTagOpen = false;
break;
}
} if (isTagOpen)
{//如果包含没有闭合的标签,则继续获取内容,直到获取到闭合标签,即获取到 ">" 字符
string rightStr = html;//.Substring(length);
int idxTagEnd = rightStr.IndexOf(">");
subHtml += rightStr.Substring(0, idxTagEnd + 1);
} Stack<string> stack = new Stack<string>(); Regex reg = new Regex(@"(<.[^>]*>)|(<\/.[^>]*>)|<br/>|<br>|<hr>|<hr/>|<img|/>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline); MatchCollection mc = reg.Matches(subHtml);
foreach (var item in mc)
{ //对<br><hr>这类标签特殊处理
string toLowerItem = item.ToString().ToLower().Replace(" ", "");
if (toLowerItem == "<img" || toLowerItem == "<br>" || toLowerItem == "<br/>" || toLowerItem == "<hr>" || toLowerItem == "<hr/>" || toLowerItem=="/>")
continue; if (item.ToString().StartsWith("</"))
{//碰到闭合的,则出栈
if (stack.Peek().Replace("<", "</") == item.ToString())
stack.Pop();
}
else
{//否则入栈
stack.Push(GetBeginTag(item.ToString()));
}
// MessageBox.Show(item.ToString());
}
while (true)
{//最后把所有没有闭合的标签出栈,补闭合标签,完成截取操作
if (stack.Count > 0)
{
subHtml += stack.Pop().Replace("<", "</");
}
else
{
break;
}
} return subHtml;
} private string GetBeginTag(string input)
{ int idx = input.IndexOf(" "); if (idx > 0)
{
return input.Substring(0, idx) + ">";
}
else
{
return input; }
}
}/////////////////
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title><%# strTitle %></title>
<link href="css.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<div class="warper">
<div class="content">
<div class="left_cont">
<div class="daohang">当前位置:<a href="default.aspx">首页</a> >> <a href="dongtai.aspx"> 评选动态</a> >> 正文</div>
<div class="pxdt third">
<div class="cont_title"> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
<div class="a_page f_color">文章发表时间:<span><asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></span> 来源:<span><asp:Label ID="Label3" runat="server" Text="Label"></asp:Label></span></div>
<div class="body_cont">
<asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
<asp:Label ID="labPageNumber" Font-Size="14px" runat="server"> </asp:Label>
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</html>