我的数据库中有两个表:Question
和Answers
。一个问题得到一个或多个答案作为其性质。我试图动态添加答案文本框。用户可以根据需要添加任意数量的所需答案。我在div中使用了面板:div1获取panel1,div2获取panel2。
在面板中我有TextBoxes,我给它动态添加并给出了他们的id数字,如txtAnswer1和txtAnswer2。当我按下提交按钮时,我想转动这个txtbox并获取它们的值,但是如何?
我尝试了这个link解决方案,但我无法做到。
http://learning2code.net/Learn/2009/8/12/Adding-Controls-to-an-ASPNET-form-Dynamically.aspx
这是设计视图:
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtCount" runat="server"></asp:TextBox>
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
</div>
<div style="border: medium solid #000000;">
<asp:Panel ID="pnlAns" runat="server"></asp:Panel>
</div>
<div style="border: medium solid #000099;">
<asp:Panel ID="pnlJ" runat="server"></asp:Panel>
</div>
<div style="border: medium solid #000000;">
<asp:Panel ID="pnlA" runat="server"></asp:Panel>
</div>
<div>
<asp:Button ID="btnGetValues" runat="server" Text="Get Values" OnClick="btnGetValues_Click" />
<br />
<asp:Label ID="lblValues" runat="server" />
</div>
</form>
这是背后的代码:
protected void btnAdd_Click(object sender, EventArgs e)
{
int count = Convert.ToInt32(txtCount.Text);
for (int i = 0; i < count; i++)
{
TextBox txt = new TextBox { ID = "txtAns" + i.ToString() };
pnlAns.Controls.Add(txt);
TextBox txtA = new TextBox { ID = "txtPoint" + i.ToString() };
pnlA.Controls.Add(txtA);
TextBox txtJ = new TextBox { ID = "txtOther" + i.ToString() };
pnlJ.Controls.Add(txtJ);
}
}
使用我的代码控件添加输入。
我想在按钮点击中获取输入值。
protected void btnGetValues_Click(object sender, EventArgs e)
{
}
我的问题是如何?
如您所见,我有3个面板和3个不同的文本框。那是我试图找到的地方。
我尝试在面板数组中添加面板,但仍然无法获取文本框值。 :(
protected void btnGetValues_Click(object sender, EventArgs e)
{
Panel[] pnls = new Panel[3] { pnlAns, pnlA, pnlJ };
foreach (Panel pnlIn in pnls)
{
lblValues.Text = pnlIn.Controls.ToString();
}
}
我不知道我怎么了,但是当我按下添加按钮时,我可以添加文本框,但它们只是html文本框。我的意思是他们是<input name="txtOther0" type="text" id="txtOther0" />
。当我尝试运行你的代码异常处理并踢出foreach循环。我猜输入没有服务器标签。如果这是问题,我怎么能让他们'runat =“服务器”'?
我是否必须添加文本框值ViewState以及是否为yes.how?
答案 0 :(得分:3)
尝试在答案文本框周围使用面板,并确保您拥有runat =“server”,并且您知道ID。然后,您可以查看该面板的子控件,并查看该控件是否为Textbox类型。如果是,那么从text属性中获取答案。
psuedo代码:
panel pnl = findpanel("mypanel");
foreach (control ctrl in pnl.controls)
{
if (ctrl is TextBox)
{
//get the text property value here
}
}
答案 1 :(得分:2)
要从TextBox
内的动态添加Panel
中检索值,您需要循环遍历TextBox
内的所有Panel
控件,如下所示:
Control answerPanel = Page.FindControl("AnswerPanelID");
foreach( Control childControl in answerPanel.Controls )
{
if( childControl is TextBox )
{
//Retrieve and store value from childControl.Text
}
}
使用此方法,您不必担心按个人ID检索控件。如果要搜索具有特定ID的控件,请使用Page.FindControl()
方法。
根据您编辑的说明:
代码只需要稍微调整一下。循环遍历一组面板控件,这是正确的。什么是不正确的,你是如何尝试获得价值的。
lblValues.Text = pnlIn.Controls.ToString()
不起作用。而不是那样,它应该是:
protected void btnGetValues_Click(object sender, EventArgs e)
{
Panel[] pnls = new Panel[3] { pnlAns, pnlA, pnlJ };
ArrayList answers = new ArrayList();
//Alternatively....
System.Collections.Hashtable ht = new System.Collections.Hashtable();
foreach (Panel pnlIn in pnls)
{
foreach( Control childControl in pnlIn.Controls )
{
if( childControl is TextBox )
{
TextBox box = (TextBox)childControl;
//Retrieve and store value from childControl.Text
answers.Add(box.Text);
//Alternatively...
ht.Add( box.ID, box.Text );
}
}
}
}
最后,您将拥有ArrayList
(或HashTable
,由TextBox
的ID编制索引),其中包含面板中所有文本框的值。如果您在面板中同时提出问题和答案,则您的if语句必须检查ID是否包含“答案”。