Avatar billede marrix Juniormester
29. juli 2010 - 22:32 Der er 10 kommentarer og
1 løsning

Asp.net - kan ikke hente teksten ud fra (dyn.) textbox i en repeater

Hej

Har en repeater som bl.a. indeholder dette:

<ItemTemplate>
<tr>
<td><%# Eval("fldHoldnavn")%>/<%# Eval("fldBy")%></td>
<td><%# Eval("PladserIalt")%></td>
<td><%# Eval("AntalLedigePladser")%></td>
<td><asp:PlaceHolder ID="PlaceHolder1" runat="server" EnableViewState="false" /></td>
</tr>
</ItemTemplate>


På bagsiden tilføjer jeg en textbox dynamisk til placeholderen i repeateren:

protected void repHoldTilmelding_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
TextBox T;
DataRowView dv = e.Item.DataItem as DataRowView;

T = new TextBox();
T.ID = "Textbox1";   
T.Attributes.Add("runat", "server");
T.EnableViewState = false;
T.Attributes.Add("EnableViewState", "false");

if (dv != null)
{
T.Text = dv["fldAntal"].ToString();
}

PlaceHolder plh = e.Item.FindControl("PlaceHolder1") as PlaceHolder;
if (plh != null)
{
plh.Controls.Add(T);
}
}


Og til at hive teksten ud fra min textbox, gør jeg dette:

protected void btnRediger2_Click(object sender, EventArgs e)
{
RelHoldDeltagerProp objRelHoldDeltagerProp = new RelHoldDeltagerProp();

foreach (RepeaterItem item in repHoldTilmelding.Items)
{
TextBox txtName;
txtName = item.FindControl("Textbox1") as TextBox;

if (txtName != null)
{
litObs.Text += "hej" + txtName.Text;
}

litObs.Text += item.ItemIndex;
}
}

Jeg bruger ikke teksten fra textboxen til noget endnu ... er bare ved at teste, hvordan det kan gøres.

Men problemet er, at jeg ikke kan hente teksten ud af textboxen(e).

Der er fin tekst i textboxen(e) når jeg kører siden, men jeg kan ikke hive teksten ud, når jeg klikker på knappen. I min litObs får jeg blot teksten 01234. Hvilket vel indikerer, at jeg ikke kommer ind i den sidste if (if (txtName != null)) - altså at der ikke bliver fundet en "Textbox1" ... men alt det andet virker og looper, som forventet.

Har googlet til noget med viewstate = false ... som jeg har forsøgt med både på repeateren og på textboxene (både den før og efter postback). Men intet ser ud til at virke.

Har også (som det kan ses) forsøgt med individuelle ID'er til de dyn. genererede textboxe - men det gør ingen forskel.

Kan nogen gennemskue, hvad jeg gør forkert eller hvad jeg evt. mangler? Er ret grøn i det her, så det kan sagtens være noget helt elementært.
Avatar billede keysersoze Guru
29. juli 2010 - 23:11 #1
Er der nogen specielt årsag til at du ikke bare sætter din tekstbox direkte ind i stedet for dynamisk at generere den?

Databinder du inden du når til click-eventen? Hvis databindingen ikke køres inden vil ItemDataBound heller ikke køre inden og så eksisterer TextBox-kontrollen ikke når Click køres.
Avatar billede marrix Juniormester
29. juli 2010 - 23:36 #2
Næ ... jeg opdagede - mens jeg ledte efter en løsning på det her problem - at jeg sagtens kan sætte textboxen direkte ind. Uden brug af placeholder. Men det retter jeg  bagefter. Går ikke ud fra, at det kan give de her problemer?!?

Jeg databinder ved page_load ... i en if (!IsPostBack). Går ud fra, at jeg ikke behøver databinde igen ved postback.
Avatar billede keysersoze Guru
29. juli 2010 - 23:46 #3
Hvis du indsætter tekstboksen i stedet for din placeholder vil den også være til at fange i din click-event.

Hvis du ikke databinder ved page_load køres din ItemDataBound - køres den ikke bliver dine dynamiske kontroller ikke oprettet - og bliver de ikke oprettet inden din click_event køres kan du ikke få fat i tekstboksene.
Avatar billede marrix Juniormester
29. juli 2010 - 23:54 #4
Men de er der jo fint - med det dynamiske indhold i. Hvorfor er det så nødvendigt at databinde igen igen?
Avatar billede marrix Juniormester
29. juli 2010 - 23:55 #5
Og hvor er det smartest at indsætte textboxen - direkte i repeateren på forsiden. Eller dynamisk i codebehind?
Avatar billede marrix Juniormester
30. juli 2010 - 00:10 #6
Nå. Fandt ud af, at det selvfølgelig var langt nemmere blot at indsætte textboxen på forsiden:

<td><asp:TextBox ID="TextBox1" Text='<%# Eval("fldAntal")%>' runat="server" /></td>

Troede egentlig ikke det kunne lade sig gøre, da jeg tænkte, at de automatisk genererede textboxe så ville få samme ID (TextBox1) - men det er åbenbart ikke et problem. Men hvis det virker - så var det da eller noget af en omvej, jeg foretog mig før.

Roder nu videre med det oprindelige problem. Forstår ikke helt det med at databinde både ved page_load og igen ved page_load/postback. Men tester lidt.
Avatar billede keysersoze Guru
30. juli 2010 - 00:14 #7
Kontrollerne er der med indhold fordi du har oprettet dem ved databind - men de er glemt igen ved postback medmindre de oprettes igen med præcis samme ID.

Jeg vil mene det både er bedst for performance og lettest for din udvikling at indsætte tekstboxen i din repeater - dynamisk oprettelse af kontroller er noget man benytter når man netop har brug for at det skal være dynamisk, fx hvis antallet af kontroller kan variere.
Avatar billede keysersoze Guru
30. juli 2010 - 00:18 #8
Hvis du vil teste min påstand så prøv at lav en simpel side hvor du i page_load tilføjer en kontrol dynamisk hvis siden ikke er i postback - og lav så fx en knap du kan foretage et postback med og se den dynamiske kontrol forsvinde efter postback.
Avatar billede marrix Juniormester
30. juli 2010 - 00:51 #9
Super ... nu virker det. Smider du et svar, så jeg kan point'e dig? :c)
Avatar billede keysersoze Guru
30. juli 2010 - 07:34 #10
svar :)
Avatar billede marrix Juniormester
30. juli 2010 - 09:39 #11
... og tusind tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester