我正在创建一个调查网站。我想动态添加文本框,然后在数据库中获取它们的值。
现在假设我从下拉列表中选择了4个动态文本框。
下拉菜单上的选择代码:
protected void NumDropDown_SelectedIndexChanged(object sender, EventArgs e)
{
if (DropDownList1.SelectedValue == "TextBox")
{
int j;
i = int.Parse(NumDropDown.SelectedValue);
Session["i"] = i;
switch (i)
{
case 1:
t = new TextBox[i];
Session["textBox"] = t;
for (j = 0; j < i; j++)
{
t[j] = new TextBox();
t[j].ID = "txtCheckbox" + j.ToString();
Panel1.Controls.Add(t[j]);
}
break;
case 2:
t = new TextBox[i];
Session["textBox"] = t;
for (j = 0; j < i; j++)
{
t[j] = new TextBox();
t[j].ID = "txtCheckbox" + j.ToString();
Panel1.Controls.Add(t[j]);
}
break;
case 3:
t = new TextBox[i];
Session["textBox"] = t;
for (j = 0; j < i; j++)
{
t[j] = new TextBox();
t[j].ID = "txtCheckbox" + j.ToString();
Panel1.Controls.Add(t[j]);
}
break;
case 4:
t = new TextBox[i];
List<TextBox> MyTextBoxes;
for (j = 0; j < i; j++)
{
t[j] = new TextBox();
t[j].ID = "txtCheckbox" + j.ToString();
Panel1.Controls.Add(t[j]);
try
{
MyTextBoxes = (List<TextBox>)Session["AddedTextBox"];
MyTextBoxes.Add(t[j]);
Session["AddedTextBox"] = MyTextBoxes;
}
catch
{
MyTextBoxes = new List<TextBox>();
MyTextBoxes.Add(t[j]);
Session["AddedTextBox"] = MyTextBoxes;
}
}
break;
}
}
}
2)然后在这里我输入textBox中的值,如a,b,c,d,然后单击ADD:
点击代码点击添加点击:
1)首先,我在Page_Init:
上检查了会话 protected void Page_Init(object sender, EventArgs e)
{
if (Session["AddedTextBox"] != null)
{
string a;
string b;
string c;
string d;
int listCount = ((List<TextBox>)Session["AddedTextBox"]).Count;
foreach (TextBox t in ((List<TextBox>)Session["AddedTextBox"]))
{
if (listCount == 1)
{
}
if (listCount == 2)
{
}
if (listCount == 3)
{
}
if (listCount == 4)
{
if (t.ID == "txtCheckbox0")
{
a = t.Text;
}
if (t.ID == "txtCheckbox0")
{
b = t.Text;
}
if (t.ID == "txtCheckbox0")
{
c = t.Text;
}
if (t.ID == "txtCheckbox0")
{
d = t.Text;
}
}
}
}
但这里的问题是我没有得到文本值,它们似乎是空的。 请帮我解决这个问题。
答案 0 :(得分:3)
这听起来像是一个古老的经典问题,asp.net动态地向页面添加控件。
问题在于回发上的控件的viewstate和重建。
您需要在页面生命周期中的正确时间运行与回发 生成控件的相同代码 ,以确保回发值与服务器端控件匹配。
当然,如果您想要一个hacky快捷方式,请直接访问Request.Form["textCheckbox" + index]
值
答案 1 :(得分:1)
正如@ jenson-button-event所提到的,您可以通过TextBox
访问Request.Form
值,这是一个例子:
<强> ASPX:强>
<asp:DropDownList ID="ddlTextBoxes" runat="server">
<asp:ListItem Value="1" Text="1" />
<asp:ListItem Value="5" Text="5" />
</asp:DropDownList>
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="Add" /><br />
<asp:PlaceHolder ID="container" runat="server" Visible="false">
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="Submit" />
</asp:PlaceHolder>
代码背后:
protected void Add(object sender, EventArgs e)
{
int numOfTxt = Convert.ToInt32(ddlTextBoxes.SelectedItem.Value);
var table = new Table();
for (int i = 0; i < numOfTxt; i++)
{
var row = new TableRow();
var cell = new TableCell();
TextBox textbox = new TextBox();
textbox.ID = "Textbox" + i;
textbox.Width = new Unit(180);
cell.Controls.Add(textbox);
row.Cells.Add(cell);
table.Rows.Add(row);
}
container.Controls.AddAt(0,table);
container.Visible = true;
}
protected void Submit(object sender, EventArgs e)
{
var textboxValues = new List<string>();
if (Request.Form.HasKeys())
{
Request.Form.AllKeys.Where(i => i.Contains("Textbox")).ToList().ForEach(i =>
{
textboxValues.Add(Request.Form[i]);
});
}
//Do something with the textbox values
textboxValues.ForEach(i => Response.Write(i + "<br />"));
container.Visible = false;
}