
Mellékelt példa megnyitása előtt szükséges egy PostBackTimer nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A megoldások egyikében egyszerűen egy <META> elemet helyezünk el a weboldalunk HTML-kódjában, ott is a <HEAD> szegmensen belül. A tagnak két attribútumát kell beállítani: a ’http-equiv’ attribútumban megadjuk, hogy milyen műveletet kell elvégezni, a ’content’ attribútumban pedig, hogy milyen időközönként. A beillesztett sor:
...
<HEAD>
<META http-equiv="refresh" content="5">
...
</HEAD>
Látható, hogy a művelet a ’refresh’ szócskával van azonosítva, mely a HTTP-fejlécmezők egyike. A második attribútumban másodpercben megadjuk az ismétlődési sűrűséget.
Timer kontrol
A másik megoldásban készítünk egy Webes kontrolt, mely hasonlít a .NET Timer komponensére, azonban valamivel egyszerűbben használható.
A kontrolhoz deklarált Designer osztályban adtuk meg, hogyan nézzen ki kontrolunk szerkesztési időben.
A kontrol létrehozásához a következőket kell tennünk: először is a kontrolt a Control osztályból származtatjuk, valamint implementálnunk kell a IPostBackEventHandler interfész tulajdonságait is.
[Designer(typeof(Designer))]
public class PostBackTimerControl : Control, IPostBackEventHandler
{
Deklarálunk három változót, melyeket a property-ken keresztül állíthatunk. Ezekkel engedélyezzük a kontrolunkat, valamint megadhatjuk az intervallumot:
private int interval = 1000;
private bool enabled = true;
private bool enableViewState = true;
A változókat állító property-k pedig:
public int Interval
{
get
{
return interval;
}
set
{
interval = value;
}
}
Az engedélyezésekhez:
public bool Enabled
{
get
{
return enabled;
}
set
{
enabled = value;
}
}
public override bool EnableViewState
{
get
{
return enableViewState;
}
set
{
enableViewState = value;
}
}
Megadunk egy eseményt a kontrolhoz:
public event EventHandler Do;
Megadjuk, hogy amikor a kérés a szerverhez ér, a deklarált esemény következzen be:
public void RaisePostBackEvent(string eventArgument)
{
OnDo(new EventArgs());
}
Készítünk egy alapértelmezett kezelőt az eseményhez:
public void OnDo(EventArgs ea)
{
if (Do != null)
{
Do(this, ea);
}
}
A kontrol „megjelenítésekor” egy JavaScript-et helyezünk el a lapon, mely meghívja a window objektum setTimeout mtódusát.
protected override void Render(HtmlTextWriter output)
{
if (enabled)
{
StringBuilder sb = new StringBuilder();
sb.Append("\n<script language=\"javascript\">\n");
sb.Append(" setTimeout(\"");
sb.Append(base.Page.GetPostBackEventReference(this));
sb.Append("\", ");
sb.Append(interval.ToString());
sb.Append(");\n</script>");
output.Write(sb.ToString());
}
}
}
A setTimeout metódus paraméterében kell megadni, hogy milyen metódust kell végrehajtani a második paraméter értékének megfelelő időközönként. A meghívandó metódus a Page osztály GetPostBackEventReference függvényének visszatérési értéke, a __doPostBack('PostBackTimerControl1',''), mely megvalósítja a PostBack eseményt. A GetPostBackEventReference által generált kód:
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.Form1;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
A window objektum setTimeout függvénye a következőképpen jelenik meg az oldalon, a kontrol Render metódusa jóvoltából:
<script language="javascript">
setTimeout("__doPostBack('PostBackTimerControl1','')", 1000);
</script>
Felhasználása előtt a kontrolt fel kell tenni a ToolBox-ra a szokásos módon: kattintsunk a ToolBox valamely lapján az egér jobb gombjával, majd a megjelenő menüből válasszuk ki a Customize ToolBox pontot, a megjelenő ablakban a .NET Frameworks Components fület. A Browse gombbal keressük elő az imént létrehozott .DLL-t.
Tesztalkalmazás
A tesztalkalmazásban a WebForm-ra felhelyezve a kontrolt, az rögtön használható, hiszen rendelkezik alapértelmezett értékkel. A programban csupán meg kell írnunk a kontrol Do eseményének kezelőjét. Először deklaráljuk:
this.PostBackTimerControl1.Do += new System.EventHandler(this.PostBackTimerControl1_Do);
Majd megírjuk, megvalósítva benne, hogy másodpercenkénti számláló indulhasson el minden egyes letöltéskor. A számláló értékeit az Application objektumba menti, majd újratöltődve abból veszi ki, és növeli meg eggyel:
if(Application["PBT"] == null)
{
Application["PBT"] = 0;
}
string strResult = "Számláló: " + Application["PBT"].ToString();
Application["PBT"] = (int)Application["PBT"] + 1; Response.Write("<font size=6 color=red>" + strResult + "</font>");
A System.Timers névtér Timer komponensétől csak annyiban tér el kontrolunk, hogy tevékenységét egy metódus végrehajtására korlátoztuk – vagyis a PostBack-t végrehajtó metódus végrehajtására - , azonban a célnak tökéletesen megfelel, használata egyszerű.