首页 新闻 赞助 找找看

自定义的服务器控件 DropDownList 的值 在页面跳转后 值不变

0
[已解决问题] 解决于 2016-10-24 13:32


 

 

#region 方法

#region 重写方法

/// <summary>
/// 为页面参数赋值
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageSize"></param>
/// <param name="queryParam"></param>
public void GetPager( int recordCount , int pageSize , string queryParam )
{

// 设置私有变量
this.recordCounter = recordCount;
this.pageSize = pageSize;
this.queryParam = queryParam;
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);

}

/// <summary>
/// 输入总条数。页数
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageSize"></param>
public void GetPager( int recordCount , int pageSize )
{

// 设置私有变量
this.recordCounter = recordCount;

this.queryParam = "id";
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);


this.pageSize =pageSize;

}

/// <summary>
/// 输入总数
/// </summary>
/// <param name="recordCount"></param>
public void GetPager( int recordCount )
{

// 设置私有变量
this.recordCounter = recordCount;

this.pageSize = Convert.ToInt32( Dselect);

this.queryParam = "id";
this.pageCount = getPageCount(recordCount , pageSize);
this.pageIndex = getPageIndex(recordCount , pageCount , queryParam);

}

#endregion

#region 生成URL

/// <summary>
/// 获取页码 产生相对应的 URL
/// </summary>
/// <param name="pageIndex"></param>
/// <returns></returns>
public string GetPageUrl( int pageIndex )
{
string pageUrl = HttpContext.Current.Request.RawUrl;

string pattern = @"(?<=[?&]" + queryParam + @"=)(\d+)\b";

Regex reg = new Regex(pattern , RegexOptions.IgnoreCase);

// Regex的作用:如果找到匹配,也就是URL中含有类似 ?page=3 或者 &page=4 这样的字符串
// 则对后面的数值进行替换

if (reg.IsMatch(pageUrl))
{
pageUrl = reg.Replace(pageUrl , pageIndex.ToString( ));
}
else
{
string queryString = HttpContext.Current.Request.Url.Query;

if (string.IsNullOrEmpty(queryString))
{

pageUrl += "?" + queryParam + "=" + pageIndex.ToString( );

}
else
{

pageUrl += "&" + queryParam + "=" + pageIndex.ToString( );

}
}

return pageUrl;
}

#endregion

#region 首页 上一页 下一页 尾页

/// <summary>
/// 添加“第一页”,“上一页”的连接
/// </summary>
/// <param name="output"></param>
public void AddPreviousLink( HtmlTextWriter output )
{

output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "第一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(1));
output.RenderBeginTag(HtmlTextWriterTag.A);
//output.Write("&lt;&lt;");
output.Write("首页");

output.RenderEndTag( );

output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "上一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageIndex - 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(" 上一页");
output.RenderEndTag( );

showPrevious = false; // 只显示一次


}


/// <summary>
/// 添加 “下一页”、“最末页” 的链接
/// </summary>
/// <param name="output"></param>
public void AddNextLink( HtmlTextWriter output )
{

output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "下一页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageIndex + 1));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(" 下一页");
output.RenderEndTag( );

output.AddAttribute(HtmlTextWriterAttribute.Class , "PagerIcon");
output.AddAttribute(HtmlTextWriterAttribute.Title , "最末页");
output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(pageCount));
output.RenderBeginTag(HtmlTextWriterTag.A);
//output.Write("&gt;&gt;");
output.Write("尾页");

output.RenderEndTag( );

//showNext = false; // 可有可无,程序会跳出循环

}
#endregion

#region 循环打印

/// <summary>
/// 根据当前页,当前页之前可以显示的页数,算得从第几页开始进行显示
/// </summary>
public void SetStartPage()
{

// 如果当前页小于它前面所可以显示的条目数,
// 那么显示第一页就是实际的第一页

if (pageIndex <= PreviousPageCount)
{
startPage = 1;
}
else

// 这种情况下 pageIndex 前面总是能显示完,
// 要根据后面的长短确定是不是前面应该多显示
{
if (pageIndex > PreviousPageCount + 1)
showPrevious = true;

int linkLength = (pageCount - pageIndex + 1) + PreviousPageCount;

int startPage = pageIndex - PreviousPageCount;

while (linkLength < PreviousPageCount + AfterPageCount + 1 && startPage > 1)
{
linkLength++;
startPage--;
}

this.startPage = startPage;
}

}

/// <summary>
/// 根据pageIndex、总页数、当前页之后长度 算得显示的最末页是 第几页
/// </summary>
public void SetEndPage()
{
// 如果当前页加上它之后可以显示的页数 大于 总页数,
// 那么显示的最末页就是实际的最末页
if (pageIndex + AfterPageCount >= pageCount)
{
endPage = pageCount;
}
else
{

// 这种情况下 pageIndex后面的总是可以显示完,
// 要根据前面的长短确定是不是后面应该多显示

//
int linkLength = (pageIndex - startPage + 1) + AfterPageCount;

int endPage = pageIndex + AfterPageCount;

while (linkLength < PreviousPageCount + AfterPageCount + 1 && endPage < pageCount)
{
linkLength++;
endPage++;
}

if (endPage < pageCount)
showNext = true;

this.endPage = endPage;
}
}

private void PrintLoop( HtmlTextWriter output )
{

// 循环打印链接
for (int i = startPage ; i <= endPage ; i++)
{
//if (showPrevious) // 如果需要显示前一页、第一页链接
// AddPreviousLink(UrlManager , output);

//if (i == endPage && showNext) // 如果需要显示 下一页、最末页 链接
// AddNextLink(UrlManager , output);

if (i == pageIndex)
{
output.AddAttribute(HtmlTextWriterAttribute.Class , "pageIndex");
}

output.AddAttribute(HtmlTextWriterAttribute.Href , GetPageUrl(i));
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write(i);
output.RenderEndTag( ); // A

}
}

#endregion

#region 下拉框
//public int selectIndex
//{
// get
// {
// int s = (int)ViewState[ "selectIndex" ];
// return s;

// }
// set
// {
// ViewState[ "selectIndex" ] = value;
// }

//}

 

public int SelectIndex = 2;

 


public string Dselect
{
get
{

return ViewState[ "Dselect" ]==null?"5":"2";
}

set
{
ViewState[ "Dselect" ] = value;
}
}

public event EventHandler SelectChanged;

//重载Controls属性,取得ControlCollection对象,该对象表示UI层次结构中的服务器控件的子控件
public override ControlCollection Controls
{
get
{
//确定服务器是否包含子控件
EnsureChildControls( );
return base.Controls;
}
}

/// <summary>
/// 动态创建子控件
/// </summary>
protected override void CreateChildControls()
{

 

this.Controls.Clear( );
ddlMonth = new TextBox( );
ddlMonth.ID = "ddlMonth";

ddlMonth.Text = "dsfklsjfls";


ddlYear = new DropDownList( );

ddlYear.ID = "ddlYder";

 

ddlYear.Items.Add(new ListItem("----请选择----" , "5"));
ddlYear.Items.Add(new ListItem("----请sfff----" , "10"));
ddlYear.Items.Add(new ListItem("----werqwe----" , "15"));
ddlYear.Items.Add(new ListItem("----发生分----" , "20"));
ddlYear.Items.Add(new ListItem("----盛大富----" , "25"));

ddlYear.SelectedIndexChanged += SelectChanged;
ddlYear.AutoPostBack = true;
ddlYear.EnableViewState = true;

this.Controls.Add(ddlYear);

this.Controls.Add(ddlMonth);


base.CreateChildControls( );
}

 

 

#endregion


#region 输出

protected override void LoadViewState( object savedState )
{
base.LoadViewState(savedState);
}

public override void RenderControl( HtmlTextWriter output )
{

 

//《span标签》
output.RenderBeginTag(HtmlTextWriterTag.Span);
output.Write(String.Format(" 第<b>{0}</b>页/共<b>{1}</b>页 " , pageIndex , pageCount));
output.RenderEndTag( );
// Span

//《div》
output.AddAttribute(HtmlTextWriterAttribute.Class , CssClass);
output.RenderBeginTag(HtmlTextWriterTag.Div);

SetStartPage( );
SetEndPage( );

//一直 显示前一页、第一页链接
AddPreviousLink(output);

PrintLoop(output);

//一直 显示 下一页、最末页 链接
AddNextLink(output);

//下拉框
AddAttributesToRender(output);
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Cellpadding , "0" , false);
ddlMonth.RenderControl(output);
output.Write("hah");

ddlYear.RenderControl(output);


}
/// <summary>
/// 以 输出流的方式写入数据
/// </summary>
/// <param name="output"></param>

 

#endregion

#endregion

孤-十-明的主页 孤-十-明 | 初学一级 | 园豆:184
提问于:2015-09-25 15:51
< >
分享
最佳答案
0

你页面跳转的时候,把你这个控件的实体获取到,传过去,在其他页面在进行初始化,你的控件代码我没怎么看,只能提个建议了

奖励园豆:5
稳稳的河 | 老鸟四级 |园豆:4216 | 2015-09-25 17:50

谢谢 大哥 回复 ,其实现在我的主要问题是  如何 实现显示页数的 可控性 。主要 选择 显示页数后 的效果跟 选择一个页码 跳转过去 一样了 。 而当 再次  点击 下一页的时候 页数 就自动还原了。

孤-十-明 | 园豆:184 (初学一级) | 2015-09-26 13:15

@孤-十-明: 这样你可以全局注入

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-09-26 14:08

@稳稳的河: 不然你的页面跳转有是一个新的控件了,参数就需要重新绑定了,就需要重新传递

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-09-26 14:10
其他回答(1)
0

大哥,用AspNetPager分页吧,自己写多累啊

imluzhi | 园豆:37 (初学一级) | 2015-09-25 17:40

这不是累的问题,自己写有好处的,再说写程序还怕累,什么都学不到

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-09-25 17:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册