webForumDet fria alternativet

dynamisk repeater behåller control:er och viewstate på kontroller

18 svar · 467 visningar · startad av Nöff

NöffMedlem sedan nov. 2003569 inlägg
#1
asmodieMedlem sedan jan. 2004501 inlägg
#2

Är inte så kunnig på repeater...
Men det borde funka att t.ex. (pseudokod):
onButtonKlick
{
Panel.Control.Add(NyttTextfält);
}

Detta funkar inte...

NöffMedlem sedan nov. 2003569 inlägg
#3

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.

asmodieMedlem sedan jan. 2004501 inlägg
#4

Vad är det man skriver nu igen för att kolla om det är en postback?

VimpMedlem sedan juli 20022 537 inlägg
#5

Vb:

If IsPostBack Then
'Lägg till fält
End If

C# (dock lite osäker):

If (IsPostBack()) {
//Lägg till fält
}
asmodieMedlem sedan jan. 2004501 inlägg
#6

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öffMedlem sedan nov. 2003569 inlägg
#7

hehe, jag förstår vad du menar, men jag löste problemet, tack för att du kämpade tappert :D ,

Jag måste säga att asp.net har en otrolig förmåga att hitta rätt viewstate till rätt control ;)

asmodieMedlem sedan jan. 2004501 inlägg
#8

Nöff hur löste du det?

NöffMedlem sedan nov. 2003569 inlägg
#9

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());
			
		}
asmodieMedlem sedan jan. 2004501 inlägg
#10

Vad är det ViewState gör exakt?

Och hur gör du när du hemtar hem den sedan?

NETworkMedlem sedan juni 20011 732 inlägg
#11

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 {}
NöffMedlem sedan nov. 2003569 inlägg
#12

Vidare är else-if-satsen ganska meningslös:

jag älskar tydlighet. :p

NETworkMedlem sedan juni 20011 732 inlägg
#13

Just därför. ;)

asmodieMedlem sedan jan. 2004501 inlägg
#14

Nöff, sugen på att svara på mina frågor?

NöffMedlem sedan nov. 2003569 inlägg
#15

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.

asmodieMedlem sedan jan. 2004501 inlägg
#16

Danke...
ViewState är riktigt nice med andra ord...

GladhMedlem sedan maj 20012 812 inlägg
#17

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

DinoMedlem sedan sep. 20011 914 inlägg
#18

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?

GladhMedlem sedan maj 20012 812 inlägg
#19

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

135 ms totalt · 3 externa anrop · v20260731065814-full.7de19299
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)