原来做的ClientNavigation没有注意只支持保存和恢复页面的scrollTop,今天发现有个应用还需要保存一下scrollLeft,于是就把ClientNavigation增了点肥,支持scrollLeft的save/load了。
原来做的
ClientNavigation没有注意只支持保存和恢复页面的scrollTop,今天发现有个应用还需要保存一下scrollLeft,于是就把ClientNavigation增了点肥,支持scrollLeft的save/load了。放在这里算是对
SmartNavigation系列文章的update吧。
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Birdshome.Web.WebControls
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Summary description for ClientNavigation.
/// </summary>
[DefaultProperty("Text")]
[ToolboxData("<{0}:ClientNavigation runat=server></{0}:ClientNavigation>")]
public class ClientNavigation : WebControl, INamingContainer, IPostBackDataHandler
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public ClientNavigation() : base()
{}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Properties#region Properties
public int PositionTop
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
object obj = ViewState["PositionTop"];
return obj == null ? 0 : (int)obj;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ViewState["PositionTop"] = value;
}
}
public int PositionLeft
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
object obj = ViewState["PositionLeft"];
return obj == null ? 0 : (int)obj;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ViewState["PositionLeft"] = value;
}
}
#endregion
protected override void Render(HtmlTextWriter writer)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.RegisterClientScript();
writer.AddAttribute(HtmlTextWriterAttribute.Type, "hidden");
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Value,
string.Format("{0}:{1}", this.PositionTop,this.PositionLeft));
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Client Script#region Client Script
private void RegisterClientScript()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
const string REGISTER_KEY = "__ClientNavigate586787__";
string strScript = @"
<script language=""javascript"">
window.attachEvent('onload', CLN_ClientNavigation);
function CLN_ClientNavigation()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
var scrollTop =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
var scrollLeft =
{1};
var scrollCount = 0;
do
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
{
scrollCount ++;
window.scrollTo(scrollLeft, scrollTop);
}}
while(document.body.scrollTop < scrollTop && scrollCount < 10 );
}}
document.body.onscroll = function()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
{
var body = document.body;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
document.all.
{2}.value = body.scrollTop + ':' + body.scrollLeft;
}}
</script>";
if ( !this.Page.IsStartupScriptRegistered(REGISTER_KEY) )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
strScript = String.Format(strScript, this.PositionTop, this.PositionLeft, this.ClientID);
this.Page.RegisterStartupScript(REGISTER_KEY, strScript);
}
}
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IPostBackDataHandler interface#region IPostBackDataHandler interface
public void RaisePostDataChangedEvent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: Add ClientNavigation.RaisePostDataChangedEvent implementation
}
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
bool modify = false;
string postData = postCollection[postDataKey];
if ( !StringHelper.IsEmpty(postData) )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string [] topleft = postData.Split(new char []
{':'});
int iPositionTop = int.Parse(topleft[0]);
int iPostionLeft = int.Parse(topleft[1]);
if ( iPositionTop != this.PositionTop )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.PositionTop = iPositionTop;
modify |= true;
}
if ( iPostionLeft != this.PositionLeft )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.PositionLeft = iPostionLeft;
modify |= true;
}
}
return modify;
}
#endregion
}
} 价格公道,童叟无欺,欢迎使用
![](/Emoticons/emsmile.gif)
。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步