[c#] asp.net usercontrol formvalues niet in postback ?

Pagina: 1
Acties:

  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
Hi

Ik heb een usercontrol (usercontrolnaampje.uscx) met daar in 3 asp:TextBox controls (txtTitel, txtThema, txtCommentaar).

Deze wordt (runtime) ingeladen in de default.aspx. Als ik nu de inoud van de textbox controls wijzig en vervolgens een postback doe (van de default.aspx) heb ik twee problemen:

In de default.aspx.cs heb ik geen idee hoe ik de txtTitel.Text kan uitlezen (deze staat nl in de usercontrol). Indien ik de gegevens in de IsPostBack uitlees van de usercontrol (deze wordt kennelijk op true gezet door de postback actie van de default.aspx) dan heb ik ze dus wel maar dan blijven de gegevens staan die er al stonden..

Iemand een idee hoe ik dit moet oplossen of wat het probleem is?

https://k1600gt.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Om de txtTitel.Text uit te kunnen lezen vanuit de pagina zal je afaik een property moeten maken in je custom control die die waarde teruggeeft:

code:
1
2
3
4
5
6
7
public string Naam
{
  get
  {
       return txtNaam.Text;
  }
}

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zou je txtTitel uit kunnen lezen uit je control door daar een Property van te maken dus in je control dit toevoegen
C#:
1
2
3
4
5
6
7
public string Titel
{
    get
    {
        return txtTitel.Text;
    }
}


Voor je andere probleem. Voeg je je control wel weer toe in je postback? Als je dit niet doet worden de waardes van je controls niet gezet.
edit:
whoami was me voor

[ Voor 5% gewijzigd door Woy op 18-08-2004 10:23 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
rwb schreef op 18 augustus 2004 @ 10:22:
Je zou je txtTitel uit kunnen lezen uit je control door daar een Property van te maken dus in je control dit toevoegen
C#:
1
2
3
4
5
6
7
public string Titel
{
    get
    {
        return txtTitel.Text;
    }
}


Voor je andere probleem. Voeg je je control wel weer toe in je postback? Als je dit niet doet worden de waardes van je controls niet gezet.
edit:
whoami was me voor
Toevoegen aan de postback gaat toch automatisch ? (omdat de uc binnen de <form></form> van de default.aspx valt of is dat onzin ?).

https://k1600gt.nl


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
shades schreef op 18 augustus 2004 @ 10:31:
[...]


Toevoegen aan de postback gaat toch automatisch ? (omdat de uc binnen de <form></form> van de default.aspx valt of is dat onzin ?).
Voeg je je control toe in je aspx dus dat je iets degelijks in je aspx heb staan?
ASP.NET:
1
<acme:MyUserControl id='blaat' runat='server' />

Dan wordt hij inderdaad automatisch toegevoegd. Als je de usercontrol in je Code toevoegt moet je hem elke postback ook weer toevoegen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
rwb schreef op 18 augustus 2004 @ 11:01:
[...]


Voeg je je control toe in je aspx dus dat je iets degelijks in je aspx heb staan?
ASP.NET:
1
<acme:MyUserControl id='blaat' runat='server' />

Dan wordt hij inderdaad automatisch toegevoegd. Als je de usercontrol in je Code toevoegt moet je hem elke postback ook weer toevoegen.
Ah, dat wist ik niet.
Kan ik dan nog steeds data er naar toe schrijven ? ik heb dit namelijk als eens geprobeert (designtime erop) maar dan wordt die al gerenderd voordat ik de properties kan vullen (zal wel een fout van mij zijn want ik ben nog niet zo heel erg thuis is c#/asp.net

https://k1600gt.nl


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
shades schreef op 18 augustus 2004 @ 16:34:
[...]


Ah, dat wist ik niet.
Kan ik dan nog steeds data er naar toe schrijven ? ik heb dit namelijk als eens geprobeert (designtime erop) maar dan wordt die al gerenderd voordat ik de properties kan vullen (zal wel een fout van mij zijn want ik ben nog niet zo heel erg thuis is c#/asp.net
Als je het in je ASPX file hebt staan dan gedraagt het control zich precies hetzelfde als zeg een TextBox.
VS.NET zal dan ook automatisch een referentie aan je codebehind toevoegen zodat je gewoon alle properties van je control aan kan roepen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
rwb schreef op 18 augustus 2004 @ 16:59:
[...]

Als je het in je ASPX file hebt staan dan gedraagt het control zich precies hetzelfde als zeg een TextBox.
VS.NET zal dan ook automatisch een referentie aan je codebehind toevoegen zodat je gewoon alle properties van je control aan kan roepen.
Dan ga ik even een klein projectje maken en niet in het origineel om e.e.a uit te proberen..

https://k1600gt.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
shades schreef op 18 augustus 2004 @ 18:01:
[...]


Dan ga ik even een klein projectje maken en niet in het origineel om e.e.a uit te proberen..
Ik kom er niet uit :|
ik heb even het project op mijn site neer gezet

Ik heb dus 3 textboxen in de webform staan en 3 in de usercontrol. Ik snap dus niet hoe ik bij de textboxen van de uc kom via de codebehind van de webform.

https://k1600gt.nl


  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
shades schreef op 18 augustus 2004 @ 21:12:
Ik heb dus 3 textboxen in de webform staan en 3 in de usercontrol. Ik snap dus niet hoe ik bij de textboxen van de uc kom via de codebehind van de webform.
Je dient allereerst een verwijzing naar het Usercontrol te maken in Default.aspx.cs. Dus:
code:
1
protected Usercontrol Usercontrol1;

Omdat je deze dezelfde naam geeft als de ID van de control in de aspx, wordt deze door asp.net automatisch gevuld.

Vervolgens maak je een property aan op de Usercontrol.ascx.cs die de tekst van de TextBox teruggeeft:
code:
1
2
3
4
public string TextUsercontrol3
{
   get { return txtUsercontrol3.Text; 
}


Deze property kun je aanroepen in in Default.aspx.cs:
code:
1
string text = Usercontrol1.TextUsercontrol3;

[ Voor 4% gewijzigd door TlighT op 18-08-2004 22:09 ]


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
TlighT schreef op 18 augustus 2004 @ 22:07:
[...]


Je dient allereerst een verwijzing naar het Usercontrol te maken in Default.aspx.cs. Dus:
code:
1
protected Usercontrol Usercontrol1;

Omdat je deze dezelfde naam geeft als de ID van de control in de aspx, wordt deze door asp.net automatisch gevuld.

Vervolgens maak je een property aan op de Usercontrol.ascx.cs die de tekst van de TextBox teruggeeft:
code:
1
2
3
4
public string TextUsercontrol3
{
   get { return txtUsercontrol3.Text; 
}


Deze property kun je aanroepen in in Default.aspx.cs:
code:
1
string text = Usercontrol1.TextUsercontrol3;
Ah. Nu is het me duidelijk.
Een usercontrol is eigenlijk een gewone class maar dan met controls erbij.
Het werkt dus...

https://k1600gt.nl


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
shades schreef op 19 augustus 2004 @ 08:06:
[...]


Ah. Nu is het me duidelijk.
Een usercontrol is eigenlijk een gewone class maar dan met controls erbij.
Het werkt dus...
Ok dat was dus nog niet duidelijk.
Om het dan nog even duidelijker te maken: In .NET is alles een Object. De Value types zijn een kleine uitzondering maar deze worden automatisch geboxed en unboxed zo nodig. Wat eigenlijk gewoon betekend dat je ze als Object kunt gebruiken. Op de achtergrond maakt de CLR dan alleen een Wrapper object aan. Het grootste verschil blijft dan ook de manier van hoe de parameters mee worden gegeven ( By reference of By value ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
boxing/unboxing is wel duur.

Een reference type bestaat op de heap, en heeft op de stack een verwijzing staan (reference) naar waar het object op de heap staat.
Het is die verwijzing die op de stack staat, die by value wordt meegegeven (niet by reference) , en niet het object zelf.
Als je dus een reference type meegeeft aan een functie, wordt die ook 'by value' meegegeven. Dwz: er wordt een kopie gemaakt van die verwijzing, en die wordt meegegeven. Eens je dus in die method zit, dan heb je 2 verwijzingen op de stack staan die naar hetzelfde object op de heap verwijzen. Vandaar dat de wijzigingen die je doet in die method ook zichtbaar zijn als je die method verlaat.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op 19 augustus 2004 @ 10:14:
boxing/unboxing is wel duur.

Een reference type bestaat op de heap, en heeft op de stack een verwijzing staan (reference) naar waar het object op de heap staat.
Het is die verwijzing die op de stack staat, die by value wordt meegegeven (niet by reference) , en niet het object zelf.
Als je dus een reference type meegeeft aan een functie, wordt die ook 'by value' meegegeven. Dwz: er wordt een kopie gemaakt van die verwijzing, en die wordt meegegeven. Eens je dus in die method zit, dan heb je 2 verwijzingen op de stack staan die naar hetzelfde object op de heap verwijzen. Vandaar dat de wijzigingen die je doet in die method ook zichtbaar zijn als je die method verlaat.
Ik wou het niet al te moeilijk uitleggen. Maar je hebt wel gelijk. Je hebt dan natuurlijk ook nog altijd het ref keyword waarbij wel de reference meegeven wordt ( Zou ook kunnen dat die aan het einde van de methode over de andere heengekopieerd wordt ) en dus ook de reference van de caller veranderd kan worden naar een ander object.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
thx voor de extra uitleg.

Ik heb nog even verder zitten spelen met de usercontrol.ascx.
Het lijkt me nogal omslachtig om van controls properties te maken. Zeker als je per control op de ascx meer dan alleen de .Text propertie wilt hebben. Heb dus de Protected System.Web.Ui.WebControls public gemaakt.

Ik kan me voorstellen dat die niet gebruikelijk is omdat je zoveel mogelijk encapsulation wilt maar goed. Het werkt wel.

De controls zijn nu aan te roepen via Usercontrol1.txtUsercontrol1.Text. In die vorm.

https://k1600gt.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Ik denk dat je die member beter protected laat, en er eventueel een public property rond maakt.
Met die property kan je er voor zorgen dat je die variable enkel kunt 'getten', en je kan er - mocht dat nodig zijn - nog meer controle in steken.

https://fgheysels.github.io/


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
Dus toch voor iedere control op de usercontrol 1 of meerdere properties maken ? Is wel een hoop werk

https://k1600gt.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:01
Nee, een property maken die die WebControls terug geeft, ipv de access modifier direct te veranderen:

code:
1
2
3
4
5
6
7
8
9
protected System.Web.Ui.WebControls _controls;

public System.Web.Ui.WebControls PageControls
{
   get
   {
         return _controls;
   }
}

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Even een klein voorbeeldje waarom het beter is om een propertie te hebben. Stel je doet ergens in je code per ongeluk
C#:
1
Usercontrol1.txtUsercontrol1 = new TextBox();

doet ( oke echt per ongeluk is dat niet maar je zou wel een andere textbox kunnen assignen ) dan kan je hele vreemde dingen krijgen aangezien je reference in je UserControl niet meer naar de juiste TextBox wijst.
Met een readonly property kan je wel alle attributen van de TextBox aanpassen maar je kan de reference naar de textbox zelf niet aanpassen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
Whoami + rwb

Ik ga hier mee stoeien. Met al deze nuttig info kom ik er denk wel uit.

https://k1600gt.nl

Pagina: 1