[C# / Asp.net]TextBox waardes uit een Repeater

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:15
Goedemiddag,

Heb hier een relatief simpel formulier, waarbij je in mijn ogen de ingevoerde waardes ook simpel uit kan halen.

Het betreft hier een Repeater, met daarin 6 TextBoxen. Deze wordt 4 x gerepeat. (met een DataTable)

Dit form wordt ingevuld, en vervolgens met een Submit in een DB gezet.

Nu zit ik me alleen rot te verzinnen over hoe je dit het makkelijkste kan doen.

Bijvoorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
foreach(RepeaterItem r_Item in repFormItems.Controls)
{
    if(r_Item.FindControl("txtDatum") is System.Web.UI.WebControls.TextBox)
    {
        boekingsdatum = ConvertRepeaterItemtoString(r_Item, "txtDatum");
    }
    if(r_Item.FindControl("txtOmschrijving") is System.Web.UI.WebControls.TextBox)
    {
        omschrijving = ConvertRepeaterItemtoString(r_Item, "txtOmschrijving");
    }
    //dit loopt door totaan de andere 4 TextBox in 1 repeater row
}

N.b.: ConvertRepeaterItemToString doet niets anders als de waarde uit de TextBox("txtDatum") teruggeven als string.

Bovenstaande is leuk en aardig, alleen krijg ik het idee dat dit simpeler kan. Even zitten stoeien en kwam tot de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
foreach(RepeaterItem r_Item in repFormItems.Controls)
{
    foreach(Control childc in r_Item.Controls)
    {
        if(childc is TextBox)
        {
            boekingsdatum = (((TextBox)childc).Text);
        }
    }
}

Leuk... maar toch niet helemaal. Je kan hier niet de de overige variables (in 1e voorbeeld bijv. omschrijving) vullen. Tenzij je boekingsdatum aanmaakt als een ArrayList oid.

2e vraag is: hoe stop ik met loopen als ik erachter kom dat de andere regels uit de repeater leeg zijn?

Zit ik het nu helemaal verkeerd te doen? Zo ja, wat doe ik dan verkeerd?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 21:29
Waarom maak je het formulier aan de hand van een datatable? Wil je vier rijen tegelijk invoeren ofzo?

Redelijk offtopic:
En gebruik in plaats van
C#:
1
2
3
4
if(childc is TextBox) 
{ 
    boekingsdatum = (((TextBox)childc).Text); 
}

Dit:
C#:
1
2
3
TextBox tb = childc as TextBox;
if(tb != null)
    boekingsdatum = tb.Text;

Is sneller dacht ik.

Roomba E5 te koop


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
ik loop altijd door repeater.items ipv repeater.controls

ik vind dat heel duidelijk (manier 1), omdat de code dan per repeaterItem-template in de designmode overeenkomt.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:15
joopst schreef op dinsdag 22 november 2005 @ 16:12:
ik loop altijd door repeater.items ipv repeater.controls

ik vind dat heel duidelijk (manier 1), omdat de code dan per repeaterItem-template in de designmode overeenkomt.
Daar zat ik ook aan te denken, maar aan een Button_Click(object sender, System.Eventargs e) kan je toch niet zomaar Repeater Events hangen?

C#:
1
Repeater1.Items[e.Item.ItemIndex]

Is inaccesible, omdat de "e" niet via het Repeater...EventArgs komt.
sig69 schreef op dinsdag 22 november 2005 @ 16:11:
Waarom maak je het formulier aan de hand van een datatable? Wil je vier rijen tegelijk invoeren ofzo?
Klopt helemaal.
Redelijk offtopic:
En gebruik in plaats van
C#:
1
2
3
4
if(childc is TextBox) 
{ 
    boekingsdatum = (((TextBox)childc).Text); 
}

Dit:
C#:
1
2
3
TextBox tb = childc as TextBox;
if(tb != null)
    boekingsdatum = tb.Text;

Is sneller dacht ik.
Volgens mij loop je dan kans op InvalidCastExceptions e.d.
questa schreef op dinsdag 22 november 2005 @ 16:23:
[...]
Nee, want je controleerd op null waarde.
Aha. Okay. Dan is dat inderdaad niet zo :)

[ Voor 12% gewijzigd door TeeDee op 22-11-2005 16:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

sig69 schreef op dinsdag 22 november 2005 @ 16:11:
Redelijk offtopic:
En gebruik in plaats van
C#:
1
2
3
4
if(childc is TextBox) 
{ 
    boekingsdatum = (((TextBox)childc).Text); 
}

Dit:
C#:
1
2
3
TextBox tb = childc as TextBox;
if(tb != null)
    boekingsdatum = tb.Text;

Is sneller dacht ik.
Als je eigelijk altijd een Textbox verwacht kun je het beste as gebruiken, anders altijd is.
Hoewel de snelheid nou niet echt snel merkbaar is :)
TeeDee schreef op dinsdag 22 november 2005 @ 16:22:
[...]

Volgens mij loop je dan kans op InvalidCastExceptions e.d.
Nee, want je controleerd op null waarde.

[ Voor 18% gewijzigd door pjvandesande op 22-11-2005 16:24 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 21:29
Als je ten alle tijde zeker weet dat je RepeaterItem 6 items bevat, zou je kunnen overwegen om ze gewoon op index te benaderen:
C#:
1
2
3
4
5
foreach(RepeaterItem r_Item in repFormItems.Controls) 
{ 
    boekingsdatum = (((TextBox)r_Item.Controls[0]).Text); 
       ietsAnders = (((TextBox)r_Item.Controls[1]).Text);
}


Edit:
Ik weet het niet meer zeker, maar volgens mij kan je controls ook op name benaderen:
C#:
1
boekingsdatum = (((TextBox)r_Item.Controls["boekingsDatum"]).Text);

Maar ik kan me vergissen hoor... (Tijdje geleden al)

[ Voor 29% gewijzigd door sig69 op 22-11-2005 16:36 ]

Roomba E5 te koop


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:15
sig69 schreef op dinsdag 22 november 2005 @ 16:31:
Als je ten alle tijde zeker weet dat je RepeaterItem 6 items bevat, zou je kunnen overwegen om ze gewoon op index te benaderen:
C#:
1
2
3
4
5
foreach(RepeaterItem r_Item in repFormItems.Controls) 
{ 
    boekingsdatum = (((TextBox)r_Item.Controls[0]).Text); 
       ietsAnders = (((TextBox)r_Item.Controls[1]).Text);
}
Dat is vooralsnog zeker, maar goed. Je zou daar eigenlijk niet vanuit moeten gaan ;)

Ik heb nu het volgende:
C#:
1
2
3
4
5
6
7
8
foreach(Control childc in r_Item.Controls)
{
    TextBox tb = childc as TextBox;
    if(tb!=null && tb.ID == "txtDatum")
    {
        boekingsdatum = tb.Text;
    }
}

Nu alleen nog inbouwen dat ie niet van een Double.parse() over zijn nek gek. Dit komt dus voor als bijvoorbeeld van de 4 rijen er maar 2 ingevuld worden.
sig69 schreef op dinsdag 22 november 2005 @ 16:31:
Ik weet het niet meer zeker, maar volgens mij kan je controls ook op name benaderen:
C#:
1
boekingsdatum = (((TextBox)r_Item.Controls["boekingsDatum"]).Text);

Maar ik kan me vergissen hoor... (Tijdje geleden al)
Dat gaat het helaas niet op. Dat moet een int zijn.

[ Voor 46% gewijzigd door TeeDee op 22-11-2005 16:46 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
TeeDee schreef op dinsdag 22 november 2005 @ 16:22:
[...]

Daar zat ik ook aan te denken, maar aan een Button_Click(object sender, System.Eventargs e) kan je toch niet zomaar Repeater Events hangen?
daarvoor heb je het repeaterItemCommand event.
Je handler hang je aan de repeater .. en elke linkbutton voorzie van je een unieke commandname/commandargument combi.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:15
joopst schreef op dinsdag 22 november 2005 @ 16:49:
[...]
daarvoor heb je het repeaterItemCommand event.
Je handler hang je aan de repeater .. en elke linkbutton voorzie van je een unieke commandname/commandargument combi.
Jup... dat kan. Maar dat kan niet als je 1 enkele Submit button buiten je repeater hebt staan die alles wat ingevuld is IN de repeater in een DB moet stoppen. Lijkt mij :)

Edit: neemt niet weg dat ik het nog wel even ga proberen natuurlijk.

[ Voor 7% gewijzigd door TeeDee op 22-11-2005 17:18 ]

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1