Avatar billede renard Nybegynder
02. marts 2007 - 00:00 Der 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...

Ex på kode med textboxes:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ds_volume" DataMember="DefaultView">
<ItemTemplate>
        <tr>
            <td>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "data1")%>'></asp:TextBox>
            </td>
            <td>
                <asp:TextBox ID="TextBox2" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "data2")%>'></asp:TextBox>
            </td>
            <td>
                <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            </td>
            <td>
                <asp:TextBox ID="TextBox4" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "data3")%>'></asp:TextBox>
            </td>
            <td>
                <asp:TextBox ID="TextBox5" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "data4")%>'></asp:TextBox>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

Jeg bruger C#.
Avatar billede mochr Nybegynder
02. marts 2007 - 00:22 #1
Skal du hente data fra dem når du klikker på en knap ?
Avatar billede renard Nybegynder
02. marts 2007 - 00:26 #2
Ja, ved klik på knap. Glemte at få det med :)
Avatar billede mochr Nybegynder
02. marts 2007 - 00:34 #3
Ok :)

Du skal bruge det event der hedder ItemCommand i repeateren.

Så kan du bruge findcontrol("").
Altså:
    protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        e.Item.FindControl("");
    }
Avatar billede mochr Nybegynder
02. marts 2007 - 00:38 #4
Glemte lige at fortælle hvordan du bruger den hehe.

Men du skal cast din findcontrol til en textbox.
Altså:

TextBox TextBox1 = (TextBox)e.Item.FindControl("TextBox1 ");

Så kan du bruge den som en textbox.
Fx. TextBox1.Text
Avatar billede renard Nybegynder
02. marts 2007 - 01:40 #5
Tak fordi du vil hjælpe, Mochr. Det er desværre lidt siden jeg har brugt asp.net; kan du uddybe eksemplet lidt?
Avatar billede mochr Nybegynder
02. marts 2007 - 01:52 #6
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.
Avatar billede renard Nybegynder
02. marts 2007 - 02:24 #7
OK - har ikke helt grejet den endnu, men kigger videre på det i morgen. Takker.
Avatar billede mochr Nybegynder
02. marts 2007 - 10:52 #8
Så er jeg tilbage :)
Ved ik lige helt hvordan jeg ellers skal foreklare det.
Avatar billede renard Nybegynder
02. marts 2007 - 13:01 #9
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 :)
Avatar billede mochr Nybegynder
02. marts 2007 - 15:08 #10
Nu tror jeg, jeg har forstået det :)

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.
Avatar billede renard Nybegynder
03. marts 2007 - 21:10 #11
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 :)
Avatar billede renard Nybegynder
04. marts 2007 - 12:14 #12
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.

Kode i aspx:
<ItemTemplate>
    <tr>
        <td align="right">
            <asp:Label ID="lbl_id" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "id_ppl")%>'></asp:Label>
        </td>
        <td align="right">
            <%#DataBinder.Eval(Container.DataItem, "name_prd")%>
        </td>
        <td align="right">
            <%#DataBinder.Eval(Container.DataItem, "volume_prd")%>
        </td>
        <td align="right">
            <%#DataBinder.Eval(Container.DataItem, "uom_prd")%>
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox1" runat="server" Width="65" Text='<%#DataBinder.Eval(Container.DataItem, "data1_ppl")%>'></asp:TextBox>
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox2" runat="server" Width="65" Text='<%#DataBinder.Eval(Container.DataItem, "data2_ppl")%>'></asp:TextBox>
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox3" runat="server" Width="30" Text='<%#DataBinder.Eval(Container.DataItem, "data3_ppl")%>'></asp:TextBox>&nbsp;kr.
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox4" runat="server" Width="30"></asp:TextBox>&nbsp;%
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox5" runat="server" Width="30" Text='<%#DataBinder.Eval(Container.DataItem, "data4_ppl")%>'></asp:TextBox>&nbsp;kr.
        </td>
        <td align="right">
            <asp:TextBox ID="TextBox6" runat="server" Width="30" Text='<%#DataBinder.Eval(Container.DataItem, "data5_ppl")%>'></asp:TextBox>&nbsp;kr.
        </td>
    </tr>
</ItemTemplate>
<FooterTemplate>
    <tr>
        <td>
            <asp:Button ID="btn_next" runat="server" OnClick="btn_next_Click" Text="Next" />
        </td>
    </tr>
    </table>
</FooterTemplate>

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!
Avatar billede renard Nybegynder
04. marts 2007 - 18:02 #13
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?!
Avatar billede renard Nybegynder
05. marts 2007 - 13:13 #14
OK, original spørgsmålet er vel løst, så jeg lukker. Mochr, der er point klar til dig som tak for hjælp.
Avatar billede mochr Nybegynder
05. marts 2007 - 13:39 #15
Hej igen renard.
Sorry jeg ikke lige fik tid til at lave det eksembel, men det er fordi der kom nogen ting i vejen.

Mvh
Avatar billede renard Nybegynder
05. marts 2007 - 16:12 #16
Hvis andre får brug for at få data fra alle rows i en repeater ved klik på én knap:
http://www.eksperten.dk/spm/766216

foreach (RepeaterItem ri in Repeater1.Items)
{
  TextBox txt_id = ri.FindControl("txt_id") as TextBox;
}
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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