【问题标题】:Get Values from Dynamically Added Textboxes从动态添加的文本框中获取值
【发布时间】:2012-12-10 18:38:59
【问题描述】:

我的数据库中有两个表: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 文本框。我的意思是他们是&lt;input name="txtOther0" type="text" id="txtOther0" /&gt;。当我尝试运行您处理的代码异常并将我踢出 foreach 循环时。我猜输入没有服务器标签。如果这是问题,我怎样才能让它们'runat =“服务器”'?

我是否必须添加文本框值 ViewState 以及如果它是。如何?

【问题讨论】:

  • 您是否在问如何从您动态添加的 TextBox 中获取值?

标签: c# asp.net dynamic


【解决方案1】:

尝试在答案文本框周围使用面板,并确保您拥有 runat="server" 并且您知道 ID。然后,您可以查看该面板的子控件,并查看该控件是否属于 Textbox 类型。如果是,则从 text 属性中获取答案。

伪代码:

panel pnl = findpanel("mypanel");
foreach (control ctrl in pnl.controls)
{
    if (ctrl is TextBox)
    {
        //get the text property value here
    }
}

【讨论】:

    【解决方案2】:

    要从Panel 内动态添加的TextBox 检索值,您需要循环遍历Panel 内的所有TextBox 控件,如下所示:

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

    【讨论】:

    • 查看我对答案的更改。
    • 我不知道我出了什么问题,但是当我按下添加按钮时,我可以添加文本框,但它们只是 html 文本框。我的意思是他们是 。当我尝试运行您处理的代码异常并将我踢出 foreach 循环时。我猜输入没有服务器标签。如果这是问题,我怎样才能让它们 runat="server" ?
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多