webForumDet fria alternativet

Hämta värden från dynamiskt genererade textboxar?

.NET

11 svar · 902 visningar · startad av elisa

Medlem sedan apr. 200432 inlägg
Frågan#1

Hej,

Jag har en funktion som dynamiskt genererar Textboxar. Men hur hämtar man ut de värden som användaren har matat in i textfälten?
Kan tillägga att jag kodar i C#.

Tacksam för ideér!

Medlem sedan aug. 20039 340 inlägg
#2

I PHP så kan man komma åt alla element som har skickats genom att gå igenom en array. Troligen finns det en liknande array i ASP, som du kan gå igenom, förslagvis med for each x in thearray eller hur man nu gör det i ASP.

Medlem sedan apr. 2004298 inlägg
#3
for(int i=0; i<Request.Form.Count; i++)
        {
            Response.Write(Request.Form[i].ToString()+"<br />");
        }

använd Request.Form.GetKey(i) för att få ut varje textboxs namn

Medlem sedan apr. 2004298 inlägg
#4

Varför du skall använda Request.Form.GetKey(i) är för att du skall kunna filtrera bort "EVENTTARGET" , "EVENTARGUMENT" och "VIEWSTATE" som ligger hidden i formuläret.

Sen kan det vara god ide att filtrera bort "Submit knappen" oxå.

Hoppas detta hjälper!

Mvh

Pär

Medlem sedan sep. 20011 914 inlägg
#5

Paraxes ide är gammalt asp tänkt. Glöm allt sånt.

Detta borde du kunna få ut något av.

Medlem sedan maj 20012 812 inlägg
#6

Jag har en funktion som dynamiskt genererar Textboxar. Men hur hämtar man ut de värden som användaren har matat in i textfälten?
Kan tillägga att jag kodar i C#.

Aaahhh klassikt problem.

Man måste tänka till lite här. Man måste komma ihåg att alla websidor är "stateless" alltså de kan inte hålla någon som helst information mellan anropen (visst man kan använda sessions och annant trams, men som utgångs punkt så är de stateless). Det betyder att de kontroller som du har i din ASPX sida är de kontroller som du har när din kodebehind exekveras.

Vilket betyder att om du har en sida och när den sidan genereras så skapar du dynamiska kontroller, dessa kommer att visas på din HTMLsida precis som du vill, men när du gör en postback så kan du inte refererar till dem. Och det beror helt enkelt på att de kontrollerna inte finns.

Som tur för vår del så brukar information om dessa kontroller sparas i viewstaten så att du faktiskt kan återfå informationen om du bara återskapar kontrollerna. nu var det ett tag sedan som jag läste om det, men om man återskapar sina kontroller innan/i Page_Init() eventet så kommer .NET själv att para ihop rätt kontrol med rätt information. Så du behöver i princip bara skapa lika många textboxar med samma ID i din Page_Init() vid din postback och så skall du kunna komma åt information i textboxarana.

Ett annat sätt som vissats i tråden ovan är att host:a dina kontroller i en annan kontroll som finns med i din ASPX sida, och då med hjälp av den kontrollens viewstate så kan .NET själv återskapa dessa kontroller till dig. Repeatern är en sådan utmärkt kontroll.

- M

Medlem sedan apr. 200432 inlägg
#7

Tack för flera bra svar!

Jag genererar textboxar från värden i databasen och varje textbox tilldelas det ID som motsvaras av aktuellt id i databastabellen.

Dino: hur tilldelar man olika ID enligt ditt kod-exempel?

.aspx

            <asp:textbox id="tbAmount" runat="server" />
            <asp:button id="btAmount" text="Ok" runat="server" />
            <asp:button id="btGet" runat="server" text="Get" />
            <asp:repeater id="repData" runat="server">
                <headertemplate>
                    <table>
                </headertemplate>
                <itemtemplate>
                    <tr>
                        <td><asp:textbox id="tbGrr" runat="server" /></td>
                    </tr>
                </itemtemplate>
                <footertemplate>
                    </table>
                </footertemplate>
            </asp:repeater>
            <br/>
            <asp:label id="lbGet" runat="server" />
.aspx.cs
        private void btAmount_Click(object sender, System.EventArgs e)
        {
            string[] s = new string[int.Parse(tbAmount.Text)];
            repData.DataSource = s;
            repData.DataBind();
        }

        private void btGet_Click(object sender, System.EventArgs e)
        {
            foreach(RepeaterItem ri in repData.Items)
            {
                if(ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
                {
                    lbGet.Text += string.Format("{0}<br/>",((TextBox)ri.FindControl("tbGrr")).Text);
                }
            }
        }

//Elisa

Medlem sedan sep. 20011 914 inlägg
#8
      <asp:repeater id="repData" runat="server">
        <headertemplate>
          <table>
        </headertemplate>
        <itemtemplate>
          <tr>
            <td>
              <asp:label id="lbId" visible="False" runat="server" />
              <asp:textbox id="tbGrr" runat="server" /></td>
          </tr>
        </itemtemplate>
        <footertemplate>
          </table>
        </footertemplate>
      </asp:repeater>
      <br/><asp:button id="btGet" runat="server" text="Get" /><br/>
      <asp:label id="lbResult" runat="server" />
private void Page_Load(object sender, System.EventArgs e)
{
   if(!IsPostBack)
      Bind();
}

private void Bind()
{
   //Hämta datan
   int[] i = {1,3,5,7,9}; 

   repData.DataSource = i;
   repData.DataBind();
}

private void repData_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      int i = (int)e.Item.DataItem;

      ((Label)e.Item.FindControl("lbId")).Text = i.ToString();
   }
}

private void btGet_Click(object sender, System.EventArgs e)
{
   foreach(RepeaterItem ri in repData.Items)
   {
      if(ri.ItemType == ListItemType.Item || ri.ItemType == ListItemType.AlternatingItem)
      {
         TextBox tb = ri.FindControl("tbGrr") as TextBox;
         Label lb = ri.FindControl("lbId") as Label;

         lbResult.Text += string.Format("{0}. {1}<br/>",lb.Text, tb.Text);
      }
   }
}
Medlem sedan apr. 200432 inlägg
#9

Ok, tack.
Ser inte att man refererar till funktionen "repData_ItemDataBound" någonstans. Ska den också vara med?

Medlem sedan sep. 20011 914 inlägg
#10
private void InitializeComponent()
{    
   this.btGet.Click += new System.EventHandler(this.btGet_Click);
   this.Load += new System.EventHandler(this.Page_Load);
   this.repData.ItemDataBound += new RepeaterItemEventHandler(repData_ItemDataBound);
}
Medlem sedan apr. 200432 inlägg
#11

Tack nu fungerar det bättre.

Medlem sedan apr. 2004298 inlägg
#12

Dino skrev:

Paraxes ide är gammalt asp tänkt. Glöm allt sånt.

Detta borde du kunna få ut något av.

:r (y) ;)

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)