webForumDet fria alternativet

textbox och dynamik och sånt

.NET

9 svar · 391 visningar · startad av Nöff

Medlem sedan nov. 2003569 inlägg
Frågan#1

hej, tänkte bara fråga.

jag har en repeater, som jag fyller med dynamiskt skapade kontroller,
och jag skapar dem i Page_Load. Men jag börjar fundera..
Det verkar som om alla dynamiska kontroller måste skapas varje gång en sida laddas och även när det sker en postback?, är det korrekt?.
Men då undrar jag om det kanske inte är bättre att skapa de dynamiska kontrollerna
i Page_Init istället , gör det nån skillnad eller nåt, eller vad säger ni?. jag vet ej.

Tex om jag har en dynamisk textbox i en repeater.
då måste jag skapa om den varje gång det sker en postback.
annars försvinner den, finns det nåt annat sätt att behålla
den förutom att skapa om den hela tiden. ska man istället lägga den i Page_Init?

Det finns ju
Page_Init
Page_Load
Page_PreRender
Page_Render
Page_Unload

Vad är alla dessa till för egentligen?

Medlem sedan maj 20012 812 inlägg
#2

Det spelar ingen roll var du lägger den, eftersom alla controller alltid måste skapas om varje gång din sida laddas. Och det beror på att en websida inte har någon status.

Alltså det är en fire-and-forgett lösning. Så fort sidan är skapad och skickad från servern, så försvinner den från minnet (i teorin) och du måste alltså skapa om kontrollerna vid nästa besök på sidan.

Så oberoende vilken av dina methoder så måste kontrollen skapas om vid en postback. Speciellt om den ligger i en repeater. Eftersom det då inte är du som skapar kontrollen utan .NET som skapar den programatiskt till dig.

- M

Medlem sedan nov. 2003569 inlägg
#3

ok, så för att vara på den säkra sidan. om:

1. har skapat en textbox dynamiskt.
2. har skapat en onclick händelsehanterare på en Button.
3. ska jag "vid klick" återskapa TextBoxen i samma händelsefunktion?

såhär? (pseudokod)

private void Page_Load(Object sender, EventArgs e)
{
Textbox mintextbox=new TextBox();
Repeater1.Controls.Add(mintextbox);
}

private void Button_Click(Object sender, EventArgs e)
{
Textbox mintextbox=new TextBox();
Repeater1.Controls.Add(mintextbox);
Response.Write(((TextBox)Repeater1.Controls[0]).Text);
}

Medlem sedan feb. 200326 inlägg
#4

japp

click-funktionen anropas efter Load, och om du ska kunna se textboxen måste den skapas i Load varje gång.

Medlem sedan maj 20012 812 inlägg
#5

Jag kan inte se varför du vill skapa en textbox dynamiskt i en repeater.

Jag hade haft med mig textboxen i min repeatermall, och istället låtit bli att skriva ut den, på de ställen du inte vill ha en textbox. Istället för att skapa den dynamiskt på de ställen du vill ha den.

- M

Medlem sedan nov. 2003569 inlägg
#6

OK. Men om jag vill ha en DropDownList i min Repeater, hur gör jag då?.

<asp:DropDownList id="DropDownList" runat="server">
<asp:ListItem Value=<%# DataBinder.Eval(Container.DataItem, "alt") %>></asp:ListItem>
</asp:DropDownList>

Detta funkade inge vidare.

Medlem sedan juni 20011 732 inlägg
#7

Du kan göra så här:

<repeater>
  <asp:DropDownList DataSource='<%# myFunction(DataBinder.Eval(Container.DataItem, "xyz")) %>' ...>
  </asp:DropDownList>
</repeater>

//i cb
protected array myFunction(object xyz) {
  //kod för att hämta data...
  return array;
}

...där du alltså skickar in en parameter xyz (exempelvis ett id) i funktionen myFunction som du sedan använder för att returnera en collection som du fyller din dropdownlist med. Det går dock snabbare att binda dina data i repeaterns ItemDataBound, typ nåt i den här stilen:

private void R_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) {
  if(e.Item.ItemType == ListItemType.Item)
    ((DropDownList)e.Item.FindControl("myDropdownlist")).DataSource = array;
}
Medlem sedan nov. 2003569 inlägg
#8

Tack. men vad menas med R_ItemDataBound?

Medlem sedan okt. 20005 273 inlägg
#9

det är en funktion som körs vid OnItemdataBound..

du sätter den i din repeater

[red]
<asp:repeater runat='server' id='myRep' onitemdatabound='R_ItemDataBound'>
[/red]

mv icaaq

Medlem sedan juni 20011 732 inlägg
#10

Alternativt om du använder vs.net, då markerar du din repeater, väljer "events" i propertiesfönstret... där hittar du bland annat ItemDataBound. Skriv ett valfritt namn för funktionen i textrutan till höger om ItemDataBound och tryck return så skapas funktionen automatiskt åt dig (och den startas då från InitializeComponent() istället för att sättas i asp.net-koden).

267 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)