dynamisk repeater behåller control:er och viewstate på kontroller
18 svar · 467 visningar · startad av Nöff
Är inte så kunnig på repeater...
Men det borde funka att t.ex. (pseudokod):
onButtonKlick
{
Panel.Control.Add(NyttTextfält);
}
Detta funkar inte...
hehe nej, det funkar inte eftersom repeatern inte kan "komma ihåg" hur många controller den har efter postback, eftersom ALLA controller måste skapas om vid varje postback.
Vad är det man skriver nu igen för att kolla om det är en postback?
Vb:
If IsPostBack Then
'Lägg till fält
End If
C# (dock lite osäker):
If (IsPostBack()) {
//Lägg till fält
}
Hmz...
här kommer en tankte på hur du kan lösa det:
Du har en int(kallar den antal) som innehåller antal fält.
Varje gång du skapar en textbox döper du den till t.ex. minBox0 för första boxen och sedan minBox1 osv. och så ökar du varje int:en med ett.
När du sedan gör en postback med knappen hämtar du alla fälten och sätter dem igen genom att skriva:
for(int i = 0; i < antal; i++)
{
TextBox myTextBox = new TextBox();
myTextBox.ID = "minBox" + i.ToSting();
myTextBox.Text = Request.Fom["minBox" + i.ToString()];
//Stoppar in den i panelen eller repeatern eller vad du nu använder dig av.
}
//Här skapar man en ny textbox med ID satt till "minBox"+ i+1
Finns säkert en smidiagre lösning.
Nöff hur löste du det?
Såhär gjorde jag. Vad som är viktigt att komma ihåg är att man "fångar" upp och genererar samma antal textboxar vid postback i PAGE_LOAD. Då fattar ASP.NET vilka textboxar som ska kopplas till viewstaten. visst e asp.net smart. :stud
private void Page_Load(object sender, System.EventArgs e)
{
if(Page.IsPostBack==false)
{
ViewState["antal"]=0;
}
else if(Page.IsPostBack==true)
{
for(int x=0;x<int.Parse(ViewState["antal"].ToString());x++)
{
Repeater1.Controls.Add(new Control());
Repeater1.Controls[Repeater1.Controls.Count-1].Controls.Add(new TextBox());
}
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
int antal=int.Parse(ViewState["antal"].ToString());
antal+=1;
ViewState["antal"]=antal;
Repeater1.Controls.Add(new Control());
Repeater1.Controls[Repeater1.Controls.Count-1].Controls.Add(new TextBox());
}
Litet tips för snyggare kod. Detta:
1: if(Page.IsPostBack==true)
2: if(Page.IsPostBack==false)
är samma sak som:
1: if(Page.IsPostBack)
2: if(!Page.IsPostBack)
Ett utropstecken (!) negotierar (heter det så???) ett uttryck, uttrycket "!sant" är alltså falskt. En liten parentes bara. :)
Vidare är else-if-satsen ganska meningslös:
if(Page.IsPostBack==false){}
else if(Page.IsPostBack==true){}
eftersom det ALLTID kommer att bli sant i den senare om första uttrycket är falskt:
if(Page.IsPostBack){}
else {}
Just därför. ;)
Nöff, sugen på att svara på mina frågor?
Nöff, sugen på att svara på mina frågor?
just fan. :) , jo, ViewState["antal"] är egentligen bara en "variabel" som sparas på din sida (den överlever en postback :D), fast gömd så du inte ser den. ViewState["antal"] är till för att den ska "komma ihåg" hur många textboxar den ska generera upp igen ifall det sker en postback.
ViewStaten för kontrollerna kommer ASP.NET själv ihåg, bara man genererar upp samma antal textboxar i PAGE_LOAD vid postback.
Danke...
ViewState är riktigt nice med andra ord...
Sitter i nästan samma sits som du satt i Nöff.
Har en repeater som har en massa linkbuttons (vill göra om det så man kan clicka på tr istället, blir väl till att göra en egen ASP:TableRow och lägga på ett clickevent, men det blir senare) när man trycker på linkbutton så tar jag bort min repeater och plockar fram en massa textboxar, alltså man editerar produkter.
Problemet var precis som ditt, att jag kan inte få tag i min linkbutton om jag inte återskapar den igen, just nu så binder jag data till min repeater (med den prestanda förlust och overhead det medför) och då det sättet jag jag få tag i min linkbutton och plocka ut mitt artikelid som jag lagt som ett attribut på linkbutton.
Det är riktigt störigt att jag måste göra detta, och undrar om någon har löst "mitt problem smidigare". Vill inte ha en massa querystring, utan tycker om postbacken.
Skall testa att bara lägga in en linkbutton i min repeater i Page_Init() och se om den ASP.NET är så smart att den binder rätt. Annars blir det väl till att återskapa alla linkbuttons i min repeater, med den overheaden som blir, riktigt störrigt, när jag sedan inte behöver anvädna mig av repeatern mer.
- Magnus
Lägg till en label med visible=false i repeatern. Ge sen labeln artikelid:t och plocka ut det därifrån när man trycker på knappen. Eller är det för simpelt?
Lägg till en label med visible=false i repeatern. Ge sen labeln artikelid:t och plocka ut det därifrån när man trycker på knappen. Eller är det för simpelt?
Det kanske hade gått, mitt problem är mer att event onClick på min linkbutton inte körs om jag inte binder om alla kontroller, och det är störigt.
Det skall nog lösa sig när jag väl orkar ta itu med problemet, blir väl någon lösning i still med Nöffs, hoppas dock att jag endast behöver binda 1 linkbutton till min repeater. Jag behöver ju bara komma åt den enda linkbutton.
- M