Ich möchte ein Integer hochzählen und das mit einem Timer in meiner ASP .NET Seite. Dieser Timer ist innerhalb eines UpdatePanels drin, d.h. es soll nicht die ganze Seite geladen werden, sondern nur ein Teil (AJAX-ähnlich / interaktiv, ich hoff ihr wisst was ich meine). Auf jeden Fall, wenn ich diese Variable hochzähle im Tick-Ereignis des Timers, dann zählt sie hoch. Nur nicht so wie ich will.
In der Funktion Page_Load wird die Variable auf 0 gesetzt. Wenn der Timer einmal tickt, ist die Variable auf 1. Beim zweiten mal wieder bei 1. Beim dritten mal wieder bei 1. Sollte aber 2 bzw. 3 sein. Anscheinend wird die Page_Load-Funktion wieder aufgerufen. Die Variable außerhalb einer Funktion auf 0 zu setzen hat genauso viel gebracht wie bisher.
Was muss ich machen, damit die Variable ordentlich hochgezählt werden kann?
Du kannst den Zähler in der Session ablegen. Damit ist er über egal wie viele Seitenaufrufe immer vorhanden. Das Zurücksetzen tätigst Du dann im Start-Event des Timers und das Hochzählen im Tick-Event.
Das das Page_Load-Event angestossen wird ist normal, Du machst ja einen Postback per Ajax.
Ich vermute mal, dass Du vielleicht vergessen hast mit Page.IsPostback zu prüfen, ob die Seite das erste Mal geladen wird?
Ich persönlich würde für einen einfachen Timer aber keine UpdatePanels verwenden. Das läßt sich mit etwas JavaScript sehr einfach und v.a. resourcenschonender realisieren. Denk daran, dass Du mit jedem Tick des Timers einen Roundtrip zum Server machst, was Zeit und Bandbreite kostet.
Hier ein einfaches Beispiel:
<script type='text/javascript'> <!--
// die Anzahl der Sekunden, die runtergezaehlt werden soll: var i = 30;
function DieZeitIstAbgelaufen() { window.clearInterval(Timer);
// hier die Aktion ausführen, die Du benötigst z.B. ein Submit o.ä. location.href = 'Beispiel.aspx?<%=request.queryString.toString %>'; }
function TimeOut() { i--;
// 'TimeTest' ist der Name des Formulares, 'time' ist ein einfaches Input-Feld: document.Timetest.time.value = i;
if (i == 0) { DieZeitIstAbgelaufen(); } }
var Timer=setInterval('TimeOut()', 1000); //--> </script>