2012-12-10 57 views
0

我的数据库中有两个表格:QuestionAnswers。一个问题的性质得到1个或更多答案。我试图动态添加答案文本框。用户可以根据需要添加尽可能多的所需答案。我在div中使用了面板:div1获取panel1,div2获取panel2等等。从动态添加文本框中获取值

在面板中我有文本框,我给动态添加,并给他们的id数字像txtAnswer1和txtAnswer2。当我按下提交按钮时,我想将这个txtboxes变成他们的值,但是怎么样?

我试过这个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" />。当我尝试运行代码的异常处理我猜输入没有服务器tag.if这是问题我该如何让他们'runat =“server”'?

我必须添加文本框的值ViewState和if它的yes.how?

+0

那么你的问题是什么? –

+0

你问的是如何从你动态添加的文本框中获取值? – Zhais

回答

3

尝试使用围绕你的答案文本框的面板,并确保你有runat =“server”并且你知道ID,然后你可以l在该面板的子控件上,并查看该控件是否为Textbox类型。如果是,那么从文本属性中获得答案。

伪代码:

​​
+0

thx但不工作 –

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是否包含“答案”。

+0

thx但乌尔代码没有回答我的问题。 –

+0

查看我对答案的更改。 – Zhais

+0

我不知道什么是我的错,但是当我按下添加按钮,我可以添加文本框,但他们只是HTML文本框。我的意思是他们是。当我尝试运行你的代码异常处理,并踢我出了foreach循环。我猜输入不具有服务器标签。如果这是问题,我该如何让他们runat =“服务器”? –

相关问题