
A mellékelt példa megnyitása előtt szükséges egy FrameFreshing nevű virtuális könyvtár létrehozása, mely a példa mappájában található Service alkönyvtárra mutat. Ehhez nyissa meg a 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 mellékelt példában két WebForm-ot tartalmaz a Web-alkalmazás. A WebForm1.aspx lap tartalmazza a WebForm2.aspx lapot úgy, hogy ez utóbbi az első egy szegmensébe töltődik be.
A megoldás két részből áll. Elsőként meg kell oldanunk, hogy a WebForm2.aspx lap egy részét képezze a WebForm1.aspx lapnak. Erre kínál megoldást az <IFRAME>, melynek SRC attribútumában lehet megadni, hogy milyen forrás szolgálja ki a kontrolt, valamint megadhatjuk a kontrol méreteit is a STYLE attribútumban.
<iframe width="350" height="100" src="WebForm2.aspx" style="Z-INDEX: 101; LEFT: 29px; WIDTH: 350px; POSITION: absolute; TOP: 78px; HEIGHT: 100px" frameborder="0" scrolling="no">
</iframe>
A második lépés, hogy a betöltődő WebForm2.aspx lap bizonyos időközönként újra betöltődjön. Ennek érdekében létrehoztunk egy PostBackControl nevű kontrolt.
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 az IPostBackEventHandler interfész tulajdonságait is.
[Designer(typeof(Designer))]
public class PostBackControl : Control, IPostBackEventHandler
{
Deklarálunk három változót, melyeket a property-ken keresztül állíthatunk be. Ezekkel engedélyezzük a kontrolunkat, valamint megadhatjuk az intervallumot:
private int interval = 5000;
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;
}
}
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 metó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('PostBackControl1',''), 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 a WebForm2.aspx lap kódjában, a kontrol Render metódusa jóvoltából:
<script language="javascript">
setTimeout("__doPostBack('PostBackControl1','')", 5000);
</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.