自动更新作为简单的自定义控件

分享于 

9分钟阅读

Web开发

  繁體

介绍

本文描述了通过使用定制控件来实现自动页面刷新的简单方法。 尽管要在需要自动刷新的每页上进行这项操作,它很简单,但是创建自定义控件很简单。 使用自定义控件,开发人员只需将控件拖放到窗体上并在ide编辑器属性中设置update间隔属性。

通常,在页面上执行自动刷新是一个问题,但在某些情况下,这是必要的。 例如如果使用基于web的GIS解决方案来跟踪启用的长卡车,可能需要使用浏览器窗口在一段时间内研究一个卡车驱动程序的探险。 为了继续更新卡车的位置,如果页面自动刷新,更新卡车( 与要求用户不断刷新浏览器按钮的要求相反)的位置将更少。 除这里之外,当页面的目的是显示股票价格或者监视在线拍卖的最终时刻时,控件可以能非常有用。

使用该控件时,更新间隔应设置为合理值。 例如,你一般不希望控件每秒更新页面,但你可以能需要按一分钟的速率捕获更新。 这里外,如果页面包含它的他控件,则必须严格维护控件状态,以防止用户发起的邮件。

根据最近对AJAX的兴趣,基于定时器的部分页面更新可能是解决大多数需求的更合理的方法。 然而,在执行周期性整页更新并不是这样的错误的情况下,这个控件是针对这些情况的。

入门

首先,解压下载的文件并打开所提供的项目。 在解决方案中,你将找到两个项目,一个是名为"自动更新"的控制库,另一个是。

图 1: 解决方案资源管理器

控件库只包含一个名为" autorefresh.vb"的类。 这里简单类定义自定义控件及其属性和方法。

测试网站包含一个网页( Default.aspx )。 这个页面包含自动刷新控件的实例,为了演示,一个 Label 控件随着当前时间的增加而更新。

网站文件夹包含对自动更新动态链接库( 库)的引用。

图 2: 运行中的测试网站

代码:AutoRefresh.vb

自动刷新控件类非常简单;类只包含默认库导入,类本身从 WebControl 类继承。 代码的第一部分如下所示:

Imports SystemImports System.Collections.GenericImports System.ComponentModelImports System.TextImports System.WebImports System.Web.UIImports System.Web.UI.WebControls
<DefaultProperty("Update Interval"), _
 ToolboxData("<{0}:AutoRefresh" & _ 
 "runat="server"></{0}:AutoRefresh>")>_PublicClass AutoRefresh
 Inherits WebControl...

这个类中的下一段代码同样简单。 声明了一个 private 成员变量,用于包含更新时间间隔值的成员变量。 遵循该变量声明,接下来的代码处理控件事件的初始化,在该事件处理程序中,控件的默认大小为 20 x 20像素。 这不用于使控件在设计时可以见,使用该控件的开发人员可以选择它并将它的属性加载到属性网格。 如果你愿意,可以将控件颜色写入( 例如控件名称),但是在设计时我没有做任何特殊的操作。

Private mTimeInterval AsIntegerPrivateSub AutoRefresh_Init(ByVal sender AsObject, _
 ByVal e As System.EventArgs)HandlesMe.Init
 Me.Height = 20Me.Width = 20EndSub

在初始化事件处理程序之后,声明一个属性,用于设置或者获取通过本地时间间隔成员变量( mTimeInterval )的当前时间间隔。

<Category("Update Interval")>_
<Browsable(True)>_
<Description("Set the interval at which the" & _
 " page will refresh (in seconds)")>_Property TimeInterval() AsIntegerGetReturn mTimeInterval
 EndGetSet(ByVal value AsInteger)
 mTimeInterval = value
 EndSetEndProperty

在检查属性代码时,请注意 CategoryBrowsableDescription的属性都包含在属性声明中。 这些属性为 Visual Studio IDE内的控件提供设计时支持。 填充属性设置网格的属性文本,以及在ide编辑器的属性中显示时间隔变量的描述。

最后要做的是渲染控件。 在这种情况下,控件真的没有任何与它相关联的可以视化,因这里只添加到页面中。 这是通过重写缺省 RenderContents 子程序来实现的:

ProtectedOverridesSub RenderContents(ByVal writer As HtmlTextWriter)
 TryDim sb AsNew StringBuilder
 sb.Append("<meta http-equiv='Refresh' content=" & TimeInterval & ">")
 writer.RenderBeginTag(HtmlTextWriterTag.Div)
 writer.Write(sb.ToString())
 writer.RenderEndTag()
 Catch ex As Exception
 ' if there is an error, the control will just display 'Auto Refresh' writer.RenderBeginTag(HtmlTextWriterTag.Div)
 writer.Write("Auto Refresh")
 writer.RenderEndTag()
 EndTryEndSubEndClass

在检查这里代码时,请注意,呈现选项包装在 尝试捕获 block,这是为了捕获控件中的任何错误,并允许控件在操作失败时呈现某些安全性。 如果未捕获这里潜在错误并且发生错误,则IDE将以不友好的方式显示错误。

还要注意,HTMLTextWriter 将刷新标记放在 div 在页面上。可以将它的写入 头部 但微软并没有提供方便的方法,而且这种做法的方法通常不值得用( 在这个例子中 true 是)。 好消息是,控件的工作正常,即使转移到 div 你也可以重写 HTMLTextWriter 开始标记( 例如你可以将它的更改为使用 头部 标记而不是 div 它将工作,但它仍然将标记放在控件的插入点,而不是实际的。 头部

代码:Default.aspx

测试网站只有一个网页,该网页为 Default.aspx。 这个页面很简单,不做任何事情,只显示当前时间;当前的时间显示在初始页面。 时间本身显示在 ASP.NET Label 控件中。 在该页面中添加了自动更新控件,并且它的间隔设置为秒property通过设计时间属性编辑器支持:

图 3: 自动刷新控件的设计时间支持

项目中唯一的实际代码是页加载事件处理程序:

PartialClass _Default
 Inherits System.Web.UI.Page
 ProtectedSub Page_Load(ByVal sender AsObject, _
 ByVal e As System.EventArgs) HandlesMe.Load
 lblTime.Text = DateTime.Now.ToShortTimeString()
 EndSubEndClass

正如你所看到的,这里唯一的东西是,每次加载页面时,ASP.NET Label 控件都会显示当前时间。 自动刷新控件将强制页面在" TimeInterval"属性中指定的时间间隔以及响应每个更新时更新。

这That了构建定制控件所需的所有编码,并在web应用程序的上下文中使用它。

摘要

示例控件和项目代表一个非常简单的控件示例,它作为控件( 如果使用较少的话) 和构建 ASP.NET 自定义控件的示例。 可以应用这里演示中使用的相同基本过程来构建任意数量的自定义控件。


相关文章