02. marts 2007 - 00:00Der er
15 kommentarer og 1 løsning
Sætte og finde dynamisk ID på textbox med repeater
Hej, jeg skal hente data fra et antal textboxes, der vises på et ukendt antal linier. De bliver dynamisk genereret med en repeater på baggrund af data fra en database. Da jeg ikke kender antallet af textboxes, kan jeg ikke give dem et fast ID, som jeg skal bruge når jeg vil hente og gemme data fra de forskellige textboxes. Hver linie har et unik ID, men da der kan være flere textboxes på en line, ved jeg ikke helt hvordan man bedst skelner mellem de forskellige textboxes...
Du skal have en knap inde i din repeater for at den kan fange eventet. Din repeater har et event der hedder ItemCommand. Den skal du bruge for at kunne fange at du trykker på knappen, og for at vide hvilken række den skal tage fra i repeateren.
I din codebind skal du så have: protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { TextBox TextBox1 = (TextBox)e.Item.FindControl("TextBox1"); TextBox TextBox2 = (TextBox)e.Item.FindControl("TextBox2"); osv... }
//Me hopper i seng nu, men vender tilbage imorgen.
Hej, jeg tror ikke, jeg har forklaret mig godt nok. Jeg skal bruge en måde at skelne de enkelte textboxes på, ikke rows i repeateren. Der er X antal rows med et kendt antal textboxes i hver. Data fra alle disse textboxes skal gemmes ved tryk på én knap. Altså textboxes fra alle rows. Mit problem er få fat på de rigtige textboxes' ID i min SQL-sætning. Har gravet lidt i det og det ser ud til, at jeg kan bruge bruge de samme ID for textboxes, da rows jo er forskellig. Jeg finder antallet af rows med Repeater1.Controls.Count og looper så igennem rows for at gemme data fra de forskellige textboxes. Men hvis jeg prøver at få fat i TextBox1 under kode ved knap-tryk, så får jeg "The name 'TextBox1' does not exist in the current context". Har det noget med repeater og knap-placering at gøre eller er det noget helt andet? Knappen ligger i FooterTemplate.
Jeg er lidt forvirret nu, beklager hvis mit spørgsmål har ændret sig :)
Jeg har engang lavet nogen lign til en indkøbskurv. Det var dog kun med en textbox. Men ingen problem hvis der var flere. Jeg brugte godt nok et gridview, men mon ik det næsten er det samme.
private void UpdateAmount() { for (int i = 0; i < GridView1.Rows.Count; i++) { TextBox OrderID = (TextBox)GridView1.Rows[i].Cells[5].Controls[1]; TextBox Amount = (TextBox)GridView1.Rows[i].Cells[5].Controls[3]; SqlDataSourceUpdateAmount.UpdateParameters["OrderID"].DefaultValue = OrderID.Text; SqlDataSourceUpdateAmount.UpdateParameters["Amount"].DefaultValue = Amount.Text; SqlDataSourceUpdateAmount.Update();
} GridView1.DataBind(); }
Jeg må lige prøve at lave et eksembel når jeg kommer hjem i aften.
Hej, jeg sidder lidt fast. Jeg kan ikke få fat i de forskellige textboxes i Repeater'en til min SQL-sætning - det er som om alt inde i Repeater'en er gemt...hvordan får man 'adgang'? Det er muligt, at det jeg skal gøre er (i) det ovenstående, men jeg kan ikke finde ud af det :)
Jeg kan kører repeater'en igennem, få lavet textboxes og putte data i dem. Men jeg kan ikke trække data i textboxes ud igen, når jeg skal gemme til databasen.
Og code behind: int number_controls = Repeater1.Controls.Count - 2;
for (int i = 1; i < number_controls; i++) { OleDbCommand cmd2 = new OleDbCommand("UPDATE tabel SET [data1_ppl]='" + TextBox1.Text + "' WHERE [id_ppl] = " + id + "", conn); //her kun med 1 textbox cmd2.ExecuteNonQuery(); }
I code behind kan jeg ikke få fat på TextBox1.Text... Please help, det er måske ikke så svært, men jeg kommer ikke videre!
OK, er alligevel kommet lidt videre :) Hvis man placerer knappen på inde i ItemTemplate i repeater'en og det her i click-eventen: Button btn = sender as Button; TextBox tb = btn.Parent.FindControl("TextBox1") as TextBox;
så virker det. Dvs., man kan få data fra den textbox der er i samme row som knappen. Det er ikke helt, hvad jeg skal bruge... Jeg ønsker at få adgang til alle textboxes' data, i.e. fra alle rows, ved klik på én knap. Nogen der kan hjælpe med det?!
foreach (RepeaterItem ri in Repeater1.Items) { TextBox txt_id = ri.FindControl("txt_id") as TextBox; }
Synes godt om
Ny brugerNybegynder
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.