AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmalig
Thema durchsuchen
Ansicht
Themen-Optionen

[ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmalig

Ein Thema von Christian Seehase · begonnen am 29. Dez 2008 · letzter Beitrag vom 29. Dez 2008
Antwort Antwort
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#1

[ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmalig

  Alt 29. Dez 2008, 12:14
Moin Zusammen,

ich mache gerade meine ersten Gehversuche mit ASP.NET (mit Visual Web Developer 2008), und bin auch prompt auf ein Problem gestossen.

Als erstes wollte ich mal einen Zähler mittels zweier Button rauf und runterzählen, und den jeweiligen Stand in einem Label anzeigen lassen.
Der Code dazu sieht dann wie folgt aus:

Code:
Partial Class Startseite
    Inherits System.Web.UI.Page
    Dim iCount As Integer
    Dim iMaxCount As Integer = 5
    Dim fFirst As Boolean = True

    Protected Sub btnPrev_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrev.Click
        iCount = iCount - 1
        btnPrev.Enabled = (iCount > 1)
        btnNext.Enabled = (iCount < iMaxCount)
        lblTitle.Text = iCount.ToString + "/" + iMaxCount.ToString + "/" + fFirst.ToString
    End Sub

    Protected Sub form1_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Init
        If fFirst Then
            iCount = 1
            btnPrev.Enabled = (iCount > 1)
            btnNext.Enabled = (iCount < iMaxCount)
            lblTitle.Text = iCount.ToString + "/" + iMaxCount.ToString + "/" + fFirst.ToString
            fFirst = False
        End If
    End Sub

    Protected Sub btnNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNext.Click
        iCount = iCount + 1
        btnPrev.Enabled = (iCount > 1)
        btnNext.Enabled = (iCount < iMaxCount)
        lblTitle.Text = iCount.ToString + "/" + iMaxCount.ToString + "/" + fFirst.ToString
    End Sub

End Class
Problem:
Beim ersten Start wird mir, wie erwartet, 1/5/true ausgegeben, Prev-Button ist disabled, Next-Button enabled.
Beim Klick auf den Next-Button ändert sich dann der Wert auf 2/5/false, beide Button sind enabled. Bis jetzt also noch OK.
Noch ein Klick auf den Next-Button: Keine Änderung
Jetzt mal in der anderen Richtung (Prev-Button): Die Anzeige ändert sich auf 0/5/false, Prev ist disabled
Wieder auf Next: 2/5/false, Prev ist enabled.
So geht es dann immer abwechselnd.

Für den Fall, dass man den Status so nicht ändern kann, wie oben zu sehen, hatte ich es auch schon mit if/then/else-Konstrukten probiert, aber ohne Änderung.

OnClick ist in der aspx-Datei für die Button nicht noch gesetzt.

Mache ich da irgendwo einen Denkfehler, oder woher kommte das Phänomen?

BTW:
Wenn jemand ein brauchbares Tutorial kennt, oder ein (oder mehrere) Buch (Bücher) empfehlen kann (gerne auch mit Informationen zu AJAX): Immer her damit
Über Google und Amazon konnte ich da nichts passendes finden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#2

Re: [ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmali

  Alt 29. Dez 2008, 12:23
Hi Christian,

ASP.NET ist Stateless.

Im Gegensatz zu Delphi existiert Dein Form nicht permanent, sondern das Form (und damit auch fFirst und iCount) wird bei jedem einzelnen Seitenaufruf neu erzeugt. Dein fFirst ist also immer true, iCount ist also immer 1.

Dieses fFirst-Konstrukt kannst Du anders handhaben: Das Property IsPostBack auf dem Property Page Deiner Form (in C# this.Page.IsPostBack) ist false, wenn die Seite initial das erste mal geladen wird und true, wenn die Seite feststellt, dass sie durch einen Postback (User Eingriff auf Client-Seite) neu aufgerufen wird.

Dein iCount musst Du darüber hinaus auch noch persistieren:
Das heisst am besten, den Wert von iCount aus dem Label zurücklesen:
Code:
if not isPostBack then
  iCount = 1
else
  iCount := Int32.Parse(LabelMitCountDrin.Text);
Dann kannst Du mit dem iCount weiterarbeiten.

Edit: Tags angepasst.
Nachtrag: Meiner Freundin pressierts grad. Muss wech. Ich hab zuhaus ein paar Bücher, unter anderem auch welche, die die gesamten Hintergrund-Konzepte (Stateless, Persistierung von Informationen (ViewState / ControlState), Postback / Callback (AJAX) sowie den ASP.NET Page Lifecycle (gaaaanz wichtig, den zu kennen!) ) erklären. Aber die Schlagworte hab ich Dir jetzt mal geliefert, da dürftest Du auch einige gute Artikel und Blogeinträge zu finden. Besonders ScottGu und RickStrahl sind gute Quellen für ASP.NET Hintergrundinformationen mit ihren Blogs.

Nachtrag 2: Wenn es keinen wirklich zwingenden Grund gibt, nimm lieber C# (oder Prism).
Die meisten Codesamples da draussen sind C#, wir haben hier ja den Syntax-Highlighter für C#, ich hasse es, VB zu lesen und so viele andere ASP.NETler die VB nutzen treiben sich hier erfahrungsgemäß nicht herum :-p
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: [ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmali

  Alt 29. Dez 2008, 15:40
Moin Sebastian,

danke für die Tips.
Ich werde dann auch noch einmal nach den genannten Suchbegriffen suchen.

Statt des Labels habe ich jetzt zu HiddenFields gegriffen, um den Wert, bzw. die Werte festzuhalten.

C# werd' ich mir dann auch noch anschauen.
Da ich, u.a., vorhabe ASP-Dateien (mit VB-Script) auf ASP.NET umzustellen, stellt sich mir nur die Frage ob ich nicht mit VB besser voran komme, zumal ich mit C# noch nicht viel gemacht habe.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#4

Re: [ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmali

  Alt 29. Dez 2008, 21:26
Hidden Fields sind eine Möglichkeit, Du musst Dir aber bewusst sein, dass sich diese sehr einfach mit Javascript auf Clientseite manipulieren lassen (das ist im HTML ein einfach <input type="hidden" value="xyz" />, wo Du den Value ganz einfach ändern kannst).

Wenn Dich das nicht stört bzw. ein modifizierter Wert unkritisch ist (dann trotzdem bitte TryParse verwenden damit Du keine Exception bekommst wenn Du auf einmal 'Wofür mag das Feld hier sein?' in einen Integer wandeln willst ) ist das eine elegante Methode, die kaum Overhead hat. Der ASP.NET Viewstate ist hingegen verschlüsselt und somit vor Manipulation sicher. Macht allerdings die Seite 'dick' und kostet Bandbreite (und dadurch Transferzeit).

Und schlag Dir das mit 'Umstellen' von ASP nach ASP.NET mal aus dem Kopf. Die Konzepte hinter ASP und ASP.NET sind so dermassen unterschiedlich, dass Du null komma nothing wiederverwenden kannst. Mal allein von den Unterschieden zwischen VB Script und VB.NET abgesehen.

Dass Du noch nicht viel mit C# gemacht hast spricht eher für Prism *fg*, aber Du wirst einfach viel mehr Infos zu Deinen Problemen in C# finden (Codeplex, CodeProject.com, Blogs, hier etc.), dass das den Nachteil der Sprachkenntnis bald aufwiegt. Und ich wage einfach zu behaupten, dass Du in C# weniger Code brauchst und der um längen lesbarer ist als das, was in VB.NET dabei rauskommen würde. Ausser natürlich, Du bist langjähriger VB Entwickler und kannst das ganze unnötige Rauschen im Code (dim, ByVal, Sub etc.) geistig komplett ausblenden und auch in Nullzeit hinschreiben...
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: [ASP.NET/VB] Inc/Dec in OnClick funktioniert nur einmali

  Alt 29. Dez 2008, 23:32
Moin Sebastian,

die leichte Änderbarkeit eines Hidden-Field spielt derzeit keine Rolle, da ich das nur bei mir benötige, aber ich behalte das mal im Kopf.
Die Frage: "Wofür mag das Feld wohl sein?" dürfte bei meiner Art Bezeichner zu vergeben keinen solchen Fehler ermöglichen, da ich auch hier die ungarische Notation verwende

Inzwischen habe ich das Ganze jetzt mal auf C# umgebaut.
Da ich VB, genauer VB-Script und VBA bislang nur im Zusammenhang mit "geerbeten" Projekten verwendet habe, kann ich jetzt auch genausogut, C# verwenden
Sollte ich denn aber Prism bewilligt bekommen...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz