Hej Det verkar som om du bara skapar dina textboxar på Not isPostBack, se till att du skapar dem även vid postback så skall du se att det fungerar bättre. Jag vet inte om det går att få fälten att läsa in sina värden när du skapar dem igen. Du har ju dock alltid värdena ifrån fälten i Request.Form, så du kan ju läsa värdena därifrån och lägga in i fälten när du återskapar dem. Det finns dels ett kommando som heter FindControl - med denna kan du leta reda på dina id:n och således fånga värdena. Du kan även använda for each - för att loopa igenom alla objekt på sidan, kolla om det är textboxar, och i så fall om id:n stämmer och därefter läsa ut informationen. Var föreslår du att jag ska lägga koden då? Du måste lägga återskapa dina controller i Page_Init för att de ska kunna behålla viewstate. Jag testade att lägga in koden i page_init. Värderna verkar sparas (vilket de gör i page_load också) men jag lyckas inte få med värdet från DropDownList-en (som ligger på samma sida men inte servergenererad). Har du något förslag på hur det ska lösas? Jag använder FindControl-funktionen och det verkar som att det funkar. Lägger jag koden för att generera ut TextBoxarna i page_load sparas värdet man fyllt i då man ändrar värdet i DropDownListan som bestämmer antalet TextBoxar men ändringen blir fördröjd en postback. Ex: En visas först, man väljer 2. Efter postbacken visas fortfarande en TextBox men Listan visar 2. Man väljer då 3 och efter postbacken visas 2 TextBoxar. osv. Är det ingen som har en lösning på detta till synes enkla problem? Jag skrev ihop ett exempel. Kolla ifall det kan hjälpa. Din kod verkar vara bra och den funkar för mig när jag kopierar in den i ett nytt projekt. Även när jag översätter den till vb.net-kod. Men det funkar inte när jag lägger in den i mitt befintliga projekt (i en usercontrol), inte heller när jag lägger in den i en usercontrol i det tomma projektet. Problemet verkar vara att värdet på dropdownlist:en inte hänger med. Oberoende av vad man har valt skickas värdet på det första valet i listan med till page_load (i ditt exempel "1"). Går det att komma runt eller måste jag göra en popup för det här formuläret? Eum... Jag testade att skapa en ascx-fil. Flyttade in controllarna. Flyttade in koden i ascx.cs-filen. Hur lade du in ascx-sidan i aspx-sidan? Det verkar som att problemet är som nämnt ovan, att antalet textboxar som genereras blir fördröjt en postback när jag lägger in det i en UserControl på det sättet. För övrigt fungerar det. Laddar du UserControlen på något annat sätt så att du inte får den fördröjningen eller går det inte att komma ifrån? Här är aspx-sidan Okej. Så har jag aldrig sett usercontrols laddas förr (men jag är inte så erfaren heller), men det funkar mycket riktigt om man gör så. Men kan man ladda olika usercontrols (olika formulär) på samma ställe med hjälp av knapptryckningar någon annanstans på aspx-sidan? Jag har löst det provisoriskt med hjälp av en knapp för att uppdatera sidan, så man slipper fördröjningen.Servergenererat formulär
Jag har experimenterat lite med att göra ett servergenererat formulär. Målet är att användaren ska kunna välja hur måna inmatningar som ska göras på samma gång (hur många textboxar som ska finnas) med hjälp av en "DropDownList" med "autopostback = true". Servern genererar då ut det antal textboxar användaren valt ungefär såhär:
Protected WithEvents MainTable As System.Web.UI.HtmlControls.HtmlTable
'MainTable är tabellen i vilken formuläret ska genereras
'"DropDownList"ans SelectedIndexChanged-sub:
For inti As Integer = 0 To list_num.SelectedIndex
Dim Row As New HtmlTableRow
Dim Cell As New HtmlTableCell
Dim Textbox As New TextBox
Textbox.ID = "txt_cat" & inti
Cell.Controls.Add(Textbox)
Row.Controls.Add(Cell)
MainTable.Controls.Add(Row)
Next
Längst ner på sidan finns två knappar, en för att spara och en för att avbryta. Allt detta ligger i en UserControl som är laddad i en cell i huvudsidan.
Så långt fungerar allt enligt mina visioner. Problemen kommer när det gäller att ta hand om den data som matats in, eller när man ändrar värdet i "DropDownList"en efter inmatning i några fält. All inmatad data försvinner nämligen. Trycker man på "Spara"-knappen (som inte har någon funktion än) försvinner även textboxarna som genererats. Jag har provat lite på måfå med "viewstate" för att få datan att stanna kvar även efter postbacks, utan positivt resultat.
Mycket tacksam för lösningar på problemet eller förslag på bättre upplägg för att nå liknande resultat.
/Peter
Sv: Servergenererat formulär
Sv: Servergenererat formulär
Sv: Servergenererat formulär
Ett liknande exempel jag skrivit som behandlar lite av det du söker efter:
<code>
' loopar alla rader i tabellen för att leta checkboxar
For Each dr In tblSelection.Rows
Dim td As TableCell
For Each td In dr.Cells
Dim ctrl As Control
For Each ctrl In td.Controls
If TypeOf (ctrl) Is CheckBox Then
Dim chkbox As CheckBox = CType(ctrl, CheckBox)
If Left(chkbox.ID, 3) = "chk" Then
id = Mid(chkbox.ID, 4)
checkstatus = IIf(chkbox.Checked = True, "1", "0")
If checkstatus = 1 Then
allclear = False ' alla är inte avmarkerade
End If
' vi uppdaterar även innehållet i textboxen
Dim txtbox As TextBox = FindControl("txt" & CStr(id))
txtbox.Text = Replace(txtbox.Text, "'", "''")
' uppdaterar posten
pellesoft.dbfunctions.ExecuteQuery("CertRunnerUpd " & id & "," & checkstatus)
Exit For
End If
End If
Next
Next
Next
</code>Sv:Servergenererat formulär
Lägger jag den i Page_Load så blir det försening på en händelse. T.ex om jag väljer 3 i listan visas bara den första. Väljer jag sedan 4 visas de tre jag valde förra gången osv.
Värdena i textboxarna hänger dock med som de ska (är kvar efter postbacken)
/PeterSv: Servergenererat formulär
Du måste även spara dina controller i t ex en arraylist när du skapar dom första gången, detta för att kunna återskapa dom vid postback.
I Page_Load är det försent, då har viewstate redan laddats och dina controller kommer vara tomma.Sv:Servergenererat formulär
/PeterSv:Servergenererat formulär
/PeterSammanfattning: Servergenererat formulär
Lägger jag istället koden i DropDownListans SelectedIndexChanged-sub sparas inte värdet man fyllt i efter postbacken. Däremot reagerar den direkt och visar det antalet TextBoxar man valt.
Något mitt emellan vore ju att föredra. Att det reagerar vid första postbacken och att den redan inmatade datan sparas. Visst måste det gå att lösa?
/PeterSv: Sammanfattning: Servergenererat formulär
Sv:Sammanfattning: Servergenererat formulär
// MvH Björne
dyn-textbox-test.aspx
<code>
<%@ Page language="c#" Codebehind="dyn-textbox-test.aspx.cs" AutoEventWireup="false" Inherits="test.dyn_textbox_test" %>
<HTML>
<HEAD></HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:DropDownList id="ddNumberOfTextboxes" runat="server" Width="200px" AutoPostBack="True">
<asp:ListItem Value="1">One</asp:ListItem>
<asp:ListItem Value="2">Two</asp:ListItem>
<asp:ListItem Value="3">Three</asp:ListItem>
</asp:DropDownList>
<asp:Table id="tblTextboxes" runat="server"></asp:Table>
</form>
</body>
</HTML>
</code>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace test {
public class dyn_textbox_test : System.Web.UI.Page {
protected System.Web.UI.WebControls.DropDownList ddNumberOfTextboxes;
protected System.Web.UI.WebControls.Table tblTextboxes;
private void Page_Load(object sender, System.EventArgs e) {
generateTexboxes();
}
private void generateTexboxes() {
int numberOfTextboxes = 0;
try {
numberOfTextboxes = Convert.ToInt16(ddNumberOfTextboxes.SelectedValue);
} catch { return; }
tblTextboxes.Rows.Clear();
for ( int i = 1 ; i <= numberOfTextboxes ; i++ ) {
TextBox textbox = new TextBox();
textbox.ID = "textbox_" + i;
addTextbox(textbox);
}
}
private void addTextbox(TextBox textbox) {
TableRow tr = new TableRow();
TableCell cell = new TableCell();
tr.Cells.Add(cell);
cell.Controls.Add(textbox);
tblTextboxes.Rows.Add(tr);
}
override protected void OnInit(EventArgs e) {
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent() {
this.Load += new System.EventHandler(this.Page_Load);
}
}
}
Sv: Sammanfattning: Servergenererat formulär
/PeterSv:Sammanfattning: Servergenererat formulär
Sen skapade jag en aspx-fil och drog in ascx-controllen in på sidan. Och det fungerade bra.
Jag kan inte riktigt se vad det är som du gör annorlunda.
// MvH BjörneSv: Sammanfattning: Servergenererat formulär
Jag skapade en cell i en tabell med runat=server där jag i page.load lade in den med
td.controls.add(findcontrol("sidan.ascx"))
Kan det ha betydelse?
/Peter
Sv:Sammanfattning: Servergenererat formulär
/PeterSv: Sammanfattning: Servergenererat formulär
<code>
<%@ Page language="c#" Codebehind="DynTextBoxPage.aspx.cs" AutoEventWireup="false" Inherits="DynTextBoxPage" %>
<%@ Register TagPrefix="uc1" TagName="DynTextBoxControl" Src="DynTextBoxControl.ascx" %>
<HTML>
<HEAD><title>DynTextBoxPage</title></HEAD>
<body>
<form id="Form1" method="post" runat="server">
<uc1:DynTextBoxControl id="DynTextBoxControl1" runat="server"></uc1:DynTextBoxControl>
</form>
</body>
</HTML>
</code>
// MvH BjörneSv:Sammanfattning: Servergenererat formulär
/PeterSv: Sammanfattning: Servergenererat formulär
I och med att jag har dynamiskt laddade UserControls fungerade inte din variant fullt ut, men tack så mycket för tipsen!
/Peter