[ASP.NET] Variabele op toepassingsniveau

Pagina: 1
Acties:

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Hoe declareer ik in een ASP.NET-webapplicatie een variabele op toepassingsniveau? Deze heb ik nodig om informatie te geven aan de verschillende controls. Of kan ik dit beter op een andere wijze oplossen?

Heeft het soms met Client-server te maken dat dit niet werkt? Ik heb het op de volgende wijze geprobeerd:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'declareren variabele sOpslaan.
Dim sOpslaan As String

'Als op cmdWijzig wordt geklikt krijgt sOplaan de waarde "Wijzig" mee.
Private Sub cmdWijzig_Click(ByVal sender As _
  System.Object, ByVal e As System.EventArgs) Handles cmdWijzig.Click
          sOpslaan = "Wijzig"
End Sub

'Als op cmdNieuw wordt geklikt krijgt sOplaan de waarde "Nieuw" mee.
Private Sub cmdNieuw_Click(ByVal sender As _
  System.Object, ByVal e As System.EventArgs) Handles cmdNieuw.Click
          sOpslaan = "Nieuw"
End Sub

'Als hierna vervolgens op cmdOpslaan wordt geklikt kijkt het programma via
'de waarde van sOpslaan of er op cmdWijzig of cmdNieuw is geklikt.
Private Sub cmdOpslaan_Click(ByVal sender As _
  System.Object, ByVal e As System.EventArgs) Handles cmdOpslaan.Click
        If sOpslaan = "Wijzig" Then
            daDebiteuren.Fill(DsDebiteuren1)
            Dim dt As DataTable = DsDebiteuren1.Tables("Debiteuren")
            Dim dr As DataRow() = dt.Select("DebID = '" + " & _
              "txtDebID.Text.ToString + "'")
            dr(0)("Naam") = txtNaam.Text
            dr(0)("Adres") = txtAdres.Text
            daDebiteuren.Update(dr)
            DataBind()
        ElseIf sOpslaan = "Nieuw" Then
            daDebiteuren.Fill(DsDebiteuren1)
            Dim dt As DataTable = DsDebiteuren1.Tables("Debiteuren")
            Dim dr As DataRow = dt.NewRow()
            dr("Naam") = txtNaam.Text
            dr("Adres") = txtAdres.Text
            daDebiteuren.Update(DsDebiteuren1)
            DataBind()
        End If
End Sub

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

1. Dump het in HTTPContext
2. Gebruik Delegates
3. Maak gebruik van een observer / mediato design pattern


Erhm... Hij onthoudt de waarde niet die je sOpslaan stopt.

Laat beide buttons afhandelen door cmdOpslaan_Click.

Cast vervolgens sender naar een linkbutton (of wat voor type knop je button dan ook is) en ga vervolgens de commandname onderzoeken.

[ Voor 62% gewijzigd door gorgi_19 op 30-10-2003 09:28 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
gorgi_19 schreef op 30 oktober 2003 @ 09:24:
1. Dump het in HTTPContext
2. Gebruik Delegates
3. Maak gebruik van een observer / mediator
Ben nog niet zo heel lang met ASP.NET bezig. Moet eerlijk zeggen dat dit me weinig zegt.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

EmilneM schreef op 30 oktober 2003 @ 09:26:
[...]


Ben nog niet zo heel lang met ASP.NET bezig. Moet eerlijk zeggen dat dit me weinig zegt.
Ik moet, nofi, ook zeggen dat je code me weinig zegt; er zijn meerdere zaken die ik vreemd vind. Wat wil je precies bereiken; zie ook mijn edit. Eerder genoemd probleem doet zich voor als de controls niet in elkaars bereik liggen, wat bij jou niet het geval is.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub HandleButton(sender as object, e as EventArgs) Handles Linkbutton1.Click, Linkbutton2.Click

    If CType(sender, Linkbutton).CommandName="Wijzig" Then

         ' Voer actie voor wijzig uit

    Elseif CType(sender, Linkbutton).CommandName = "VoegToe" Then

         ' Voer actie toevoegen uit

    Else

         Throw new Exception("HandleButton::Undefined Commandname")

    End if
End sub


En anders moet je
Visual Basic .NET:
1
Dim sOpslaan As String

vervangen door
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Public Property sString() As String
        Get
            If Viewstate("sString") Is Nothing Then Return ""
            Return CType(Viewstate("sString"), String)
        End Get
        Set(ByVal Value As String)
            Viewstate("sString") = Value
        End Set
    End Property

[ Voor 77% gewijzigd door gorgi_19 op 30-10-2003 09:37 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Wat bedoel je met een variabele op 'toepassingsniveau'?

Je zou eens kunnen kijken naar de objecten: Session, ViewState en Application

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 30 oktober 2003 @ 09:40:
Wat bedoel je met een variabele op 'toepassingsniveau'?

Je zou eens kunnen kijken naar de objecten: Session, ViewState en Application
Application is eng voor een aantal dingen; imho kan je dan voor dit soort dingen beter Cache gebruiken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
gorgi_19 schreef op 30 oktober 2003 @ 09:41:
[...]

Application is eng voor een aantal dingen;
Zoals?
Waarom?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

[quote]whoami schreef op 30 oktober 2003 @ 09:42:
gorgi_19 schreef op 30 oktober 2003 @ 09:41:
[...]

Application is eng voor een aantal dingen; [/qutoe]
Zoals?
Waarom?
Application hebben een global scope en verlopen niet, tenzij de application crashed. Voor heel veel zaken is deze lifetime veel te lang; ook heb je zo geen controle over wat er in het geheugen blijft. Minder vaak gebruikte objecten, of periodiek veelgebruikte objecten, hebben zo een lange lifespan en nemen (onnodig) geheugen in.

Daarom is imho Cache daar een beter alternatief voor; deze kent een prioritering en kent een eigen verlooptijd, die je zelf kan instellen. Verder kan je invalideren als gegevens wijzigen; (in ASP.Net 2.0 ook op basis van SQL data)

Ik zeg niet dat je nooit application moet gebruiken, en dat het in een aantal gevallen nuttig is (zoals connectionstring), maar niet voor 'losse variabelen in een pagina'.

Wat de TS wil, het doorgeven van variabelen, moet je uitkijken dat je geen global scope gebruikt (immers, web applicatie). Shared (of static) variabelen, cache en application vormen in dit opzicht een risico, omdat deze een application scope hebben.

[ Voor 15% gewijzigd door gorgi_19 op 30-10-2003 10:10 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
De webapplicatie is gekoppeld aan een database met klanten die in een datagrid worden weergegeven. De details van de klant worden weergegeven (na een filtering via dataview) via textboxen als op de naam van de klant in de datagrid wordt geklikt.

De textboxen zijn vergrendeld zodat de gegevens niet direct gewijzigd kunnen worden, daarvoor moet de gebruiker eerst op de knop "Wijzig" klikken. Vervolgens worden de textboxen ge-unlocked zodat de gegevens gewijzigd kunnen worden. Als nu op de knop "Opslaan" wordt geklikt worden de gegevens pas naar de database weggeschreven. Hetzelfde gaat met de knop "Nieuw", waarmee een nieuwe klant aangemaakt kan worden. Omdat het opslaan van een nieuwe en gewijzigde klant op een andere wijze gaat dacht ik met een variabele te kunnen werken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
gorgi_19 schreef op 30 oktober 2003 @ 09:45:
Ik zeg niet dat je nooit application moet gebruiken, en dat het in een aantal gevallen nuttig is (zoals connectionstring), maar niet voor 'losse variabelen in een pagina'.
'Losse' variabelen in een pagina die enkel door die pagina gebruikt worden, sla je zowiezo best op in de ViewState van die pagina.
Wat de TS wil, het doorgeven van variabelen, moet je uitkijken dat je geen global scope gebruikt (immers, web applicatie). Shared (of static) variabelen, cache en application vormen in dit opzicht een risico, omdat deze een application scope hebben.
Doorgeven kan je ook doen dmv de QueryString.
Als die variabelen per user afhankelijk zijn, dan gebruik je natuurlijk het sessie-object. (Wat jij zegt dus. :P)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
EmilneM schreef op 30 oktober 2003 @ 09:48:
De textboxen zijn vergrendeld zodat de gegevens niet direct gewijzigd kunnen worden, daarvoor moet de gebruiker eerst op de knop "Wijzig" klikken. Vervolgens worden de textboxen ge-unlocked zodat de gegevens gewijzigd kunnen worden. Als nu op de knop "Opslaan" wordt geklikt worden de gegevens pas naar de database weggeschreven. Hetzelfde gaat met de knop "Nieuw", waarmee een nieuwe klant aangemaakt kan worden. Omdat het opslaan van een nieuwe en gewijzigde klant op een andere wijze gaat dacht ik met een variabele te kunnen werken.
Kan je het wijzigen van klanten niet doen door een EditCommandColumn? Of laat je niet alle wijzigbare data zien in je datagrid?

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 30 oktober 2003 @ 09:49:
Doorgeven kan je ook doen dmv de QueryString.
Als die variabelen per user afhankelijk zijn, dan gebruik je natuurlijk het sessie-object. (Wat jij zegt dus. :P)
Wat is er in dit geval tegen het gebruik van Viewstate? :P (wat eigenlijk mijn voorkeur heeft.. :P)

Querystring is eng; moet ik of de boel gaan encoden, of zorgen dat ze m'n querystring niet gaan vernaggelen (Echter, querystring is wel weer stukken sneller dan POST)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 30 oktober 2003 @ 09:50:
[...]


Kan je het wijzigen van klanten niet doen door een EditCommandColumn? Of laat je niet alle wijzigbare data zien in je datagrid?
Nee, in de datagrid staan alleen de namen van de klant. Wijzigen gaat via de textboxen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 30 oktober 2003 @ 09:50:
[...]


Kan je het wijzigen van klanten niet doen door een EditCommandColumn? Of laat je niet alle wijzigbare data zien in je datagrid?
Dat maakt eigenlijk nog niet uit; de andere te gebruiken techniek, zijn de Master/Detail pages. Afgelopen jaar zijn er al redelijk wat artikelen over verschenen. :P

Zie bijvoorbeeld http://www.dotnetjunkies....4307bcf12017&forumid=4083

[ Voor 14% gewijzigd door gorgi_19 op 30-10-2003 10:01 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
gorgi_19 schreef op 30 oktober 2003 @ 09:51:
[...]

Wat is er in dit geval tegen het gebruik van Viewstate? :P (wat eigenlijk mijn voorkeur heeft.. :P)
Hoe haal je variabelen die in de viewstate staan in een pagina op vanuit een andere pagina?
* whoami moet nog eens wat met asp.net gaan doen.

Master/Detail is idd ook mogelijk ivm updaten.
Vooral als het veel velden betreft geniet dat de voorkeur imo.

[ Voor 14% gewijzigd door whoami op 30-10-2003 09:58 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 30 oktober 2003 @ 09:58:
[...]

Hoe haal je variabelen die in de viewstate staan in een pagina op vanuit een andere pagina?
* whoami moet nog eens wat met asp.net gaan doen.
Niet. :) Alleen ik heb hier niet het idee dat ze buiten de usercontrol / page gaan, in dit specifieke geval. Viewstate is erg handig om informatie op te slaan tussen postbacks.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Zolang je de informatie enkel op de pagina zelf nodig hebt, en daar niet buiten, dan is ViewState idd de beste optie.
Echter, ik geloof dat ik ooit eens iets gelezen heb dat je vanuit een andere pagina toch wel de viewstate van een andere pagina kon uitlezen.

Stel, je hebt pagina A, en vanuit pagina A navigeer je naar pagina B. Op pagina B kon je de viewstate van pagina A uitlezen.
De voorwaarde was dan wel dat je van A naar B navigeerde met Server.Transfer (dacht ik) en dat EnableViewStateMac op false staat (waardoor de Viewstate dus niet ge-encrypt wordt).
Dit zou mogelijk geweest zijn in .NET 1.0, 'k weet niet of het in .NET 1.1 ook mogelijk is

Misschien is deze link handig. 'k Heb hem net ff vluchtig bekeken.... don't shoot me als het niet echt over deze problematiek gaat. :)

[ Voor 18% gewijzigd door whoami op 30-10-2003 10:15 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Zelf ben ik niet zo een fan van Server.Transfer. Imho kan je net zo goed met Usercontrols gaan werken; krijg je hetzelfde effect, maar geen problemen met je Viewstate.

Een voorbeeld artikel hiervan is http://www.ftponline.com/.../magazine/columns/aspnet/ ; hier komt ook heel erg mooi de problematiek verder van dynamische controls naar voren, maar geeft ook een hele mooie alternatieve oplossing voor Server.Transfer.

Link even bekeken; die vraagt iig om een andere bestudering. :P

[ Voor 38% gewijzigd door gorgi_19 op 30-10-2003 10:24 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
gorgi_19 schreef op 30 oktober 2003 @ 09:30:
[...]

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
    Public Property sString() As String
        Get
            If Viewstate("sString") Is Nothing Then Return ""
            Return CType(Viewstate("sString"), String)
        End Get
        Set(ByVal Value As String)
            Viewstate("sString") = Value
        End Set
    End Property
Dit wil niet helemaal lukken.....moet ik bij het onclick-event van de knoppen cmdNieuw en cmdWijzig wel gewoon de volgende code gebruiken?

Visual Basic .NET:
1
sOpslaan = "Nieuw"

Visual Basic .NET:
1
sOpslaan = "Wijzig"

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Ja, maar je kan ook veel beter de andere code gebruiken.

[ Voor 5% gewijzigd door gorgi_19 op 30-10-2003 10:53 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
gorgi_19 schreef op 30 oktober 2003 @ 10:47:
Ja, maar je kan ook veel beter de andere code gebruiken.
Wil je wat meer toelichting op die code geven dan?

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
gorgi_19 schreef op 30 oktober 2003 @ 09:30:
[...]

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
    Public Property sString() As String
        Get
            If Viewstate("sString") Is Nothing _
              Then Return ""
            Return CType(Viewstate("sString"), _
              String)
        End Get
        Set(ByVal Value As String)
            Viewstate("sString") = Value
        End Set
    End Property
Het is me toch op bovenstaande manier gelukt.......Stond een foutje in de code waarom het niet lukte.

Nu heb ik nog een probleem dat hier volgens mij ook mee verwant is:
Ik heb een listbox met allemaal klanten er in. Als ik op een item in die listbox klik worden de gegevens van een bepaalde klant via dataview er uit gefilterd en in textboxen weergegeven.

De listbox staat op 'AutoPostBack = True' zodat dit direct gebeurt als ik een item aanklik. Nu wordt alleen niet de selectie in de listbox onthouden zodat er na de postback geen item is geselecteerd. Ik wil dat het item dat zojuist is aangeklikt geselecteerd blijft of opnieuw geselecteerd wordt in de listbox. Ik heb het al met de selectedindex als public property (als bovenstaand) geprobeerd maar krijg het niet voor elkaar.

Hoe is dit voor elkaar te krijgen?

[ Voor 8% gewijzigd door EmilneM op 31-10-2003 08:41 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
EnableViewState v/d listbox op true zetten.

Je zult de SelectedIndex van voor de postback moeten bewaren, en dan in de page-load zet je die SelectedIndex opnieuw ofzo.

[ Voor 61% gewijzigd door whoami op 31-10-2003 08:45 ]

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 31 oktober 2003 @ 08:44:
EnableViewState v/d listbox op true zetten.

Je zult de SelectedIndex van voor de postback moeten bewaren, en dan in de page-load zet je die SelectedIndex opnieuw ofzo.
Dat idee had ik ook, heb het geprobeerd met de selectedindex op te slaan in de viewstate via public property, maar krijg het niet voor elkaar....

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Zeer vreemd.
Laad je je ListBox iedere keer opnieuw in misschien bij de Page_Load?
Ik heb het net ff geprobeerd, en ik heb dat probleem niet.

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 31 oktober 2003 @ 08:51:
Zeer vreemd.
Laad je je ListBox iedere keer opnieuw in misschien bij de Page_Load?
Ik heb het net ff geprobeerd, en ik heb dat probleem niet.
Nee ListBox wordt alleen opnieuw ingeladen bij 'If Not Page.IsPostBack'.

Hoe heb je precies de variabele (selectedindex) gedeclareerd?

[ Voor 4% gewijzigd door EmilneM op 31-10-2003 08:53 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
EmilneM schreef op 31 oktober 2003 @ 08:52:
Hoe heb je precies de variabele (selectedindex) gedeclareerd?
:?
niet.
Wat bedoel je?

code:
1
2
3
4
5
6
7
if( !this.IsPostback )
{
   listBox1.DataSource = dsMyData;
   listBox1.DataTextField = "naam";
   listBox1.DataValueField = "Id";
   listBox1.DataBind();
}


Dit is de code die ik heb, de AutoPostback property van listBox1 staat op true. En dat werkt perfect.

[ Voor 44% gewijzigd door whoami op 31-10-2003 09:07 ]

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 31 oktober 2003 @ 09:03:
[...]

:?
niet.
Wat bedoel je?

code:
1
2
3
4
5
6
7
if( !this.IsPostback )
{
   listBox1.DataSource = dsMyData;
   listBox1.DataTextField = "naam";
   listBox1.DataValueField = "Id";
   listBox1.DataBind();
}


Dit is de code die ik heb, de AutoPostback property van listBox1 staat op true. En dat werkt perfect.
En hoe geef je dan precies de SelectedIndex door?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Dat gaat automatisch, tenzij je de selectedindex overschrijft met een nieuwe databind, zelf een selectedindex zet, of de viewstate uit staat.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
gorgi_19 schreef op 31 oktober 2003 @ 09:26:
Dat gaat automatisch, tenzij je de selectedindex overschrijft met een nieuwe databind, zelf een selectedindex zet, of de viewstate uit staat.
Huh, hier niet.....misschien komt het omdat de listbox niet de focus meer heeft na de postback :? .

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Ik begrijp totaal niet meer wat je bedoeld en wat je nu precies wilt.
Wat bedoel je met 'de selectedindex doorgeven'?
Naar wat wil je dat doorgeven?

Kan je iets duidelijker zijn en wat meer info geven?

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Ben er nu achter dat inderdaad de selectedindex bewaard wordt. Maar kun je net als in een gewone Windows-applicatie zorgen dat er altijd een item in de listbox gemarkeerd is, zodat je altijd in de listbox kunt zien welk item geselecteerd is. Ook als een ander item de focus heeft.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

EmilneM schreef op 31 oktober 2003 @ 10:13:
Ben er nu achter dat inderdaad de selectedindex bewaard wordt. Maar kun je net als in een gewone Windows-applicatie zorgen dat er altijd een item in de listbox gemarkeerd is, zodat je altijd in de listbox kunt zien welk item geselecteerd is. Ook als een ander item de focus heeft.
Visual Basic .NET:
1
2
3
Dim __dropdownlist as DropDownList 
(...)
__dropdownlist.SelectedIndex = 2

:?

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1