【问题标题】:Calling Dynamically Created Textboxes in C# Visual Studio在 C# Visual Studio 中调用动态创建的文本框
【发布时间】:2017-05-26 02:17:27
【问题描述】:

在这篇文章中,我想弄清楚如何在 C# Visual Studio 中创建动态创建的文本框。

Adding additional textboxes to aspx based on xml

但是,当我稍后在我的代码中尝试调用这些动态创建的文本框的 ID 以找出用户输入其中的文本时,我收到一个错误,指出这些 ID 在当前上下文中不存在。有谁知道我怎么称呼这些?

【问题讨论】:

标签: c# asp.net


【解决方案1】:

感谢Adding additional textboxes to aspx based on xml

这是我的全部代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;

namespace WebApplication4
{
    public partial class WebForm15 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsCallback)
            {
                //credit to https://stackoverflow.com/questions/44076955/adding-additional-textboxes-to-aspx-based-on-xml#comment75336978_44078684
                const string xml = @"<Number>
                       <Num>1</Num>
                       <Num>2</Num>
                       <Num>3</Num>
                     </Number>";

                XDocument doc = XDocument.Parse(xml);
                int i = 0;

                foreach (XElement num in doc.Root.Elements())
                {
                    TextBox box = new TextBox
                    {
                        ID = "dynamicTextBox" + i,
                        Text = num.Value,
                        ReadOnly = false
                    };
                    divToAddTo.Controls.Add(box);

                    divToAddTo.Controls.Add(new LiteralControl("<br/>"));

                    i++;
                }
            }
        }

        protected void BtnGetValues_Click(object sender, EventArgs e)
        {
            IList<string> valueReturnArray = new List<string>();
            foreach (Control d in divToAddTo.Controls)
            {
                if (d is TextBox)
                {
                    valueReturnArray.Add(((TextBox)d).Text);
                }
            }
            //valueReturnArray will now contain the values of all the textboxes
        }
    }
}

这里是aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm15.aspx.cs" Inherits="WebApplication4.WebForm15" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
</head>
<body>
    <form id="form1" runat="server">
        <div id="divToAddTo" runat="server" />
        <asp:Button runat="server" ID="BtnGetValues" Text="GetValues" OnClick="BtnGetValues_Click" />
    </form>
</body>
</html>

【讨论】:

  • 我在这里尝试了你的答案,它给了我一个空字符串列表。你知道为什么或如何解决这个问题吗?
  • @Blah Blah 请尝试我的转发。请让我知道是否可以为您提供任何其他帮助。
  • kblau 再次不起作用。我相信我的问题是用户输入信息,当按下按钮保存他们的数据时,会发生回发并删除文本框以及在其中创建的内容。因此,我所有的文本框都是空字符串。另外作为旁注,文本框由用户填充,而 xml 确定需要多少文本框。如果您有任何其他解决方案,将不胜感激
【解决方案2】:

想通了!!!这是我在网上搜索了几个小时后发现的

解决方案: 使用动态控件时,您必须记住它们只会存在到下一次 postback。ASP.NET 不会重新创建动态添加的控件。如果您需要多次重新创建控件,则应在 PageLoad 事件处理程序中执行控件创建(因为目前您只是第一次使用 Condition: !IsPostabck 创建 TextBox)。这还有一个额外的好处,就是允许您在动态控件中使用视图状态。即使视图状态通常在 Page.Load 事件之前恢复,如果您在 PageLoad 事件的处理程序中创建一个控件,ASP.NET 将应用它在 PageLoad 事件处理程序结束后拥有的任何视图状态信息。

所以,去掉条件:!IsPostback,这样每次页面加载时,TextBox 控件也会被创建。您还将看到在 PageLoad 处理程序完成后保存的文本状态框。 [ 显然你没有禁用 ViewState !!! ]

例子:

protected void Page_Load(object sender, EventArgs e) {

TextBox txtBox = new TextBox();
// Assign some text and an ID so you can retrieve it later. 

txtBox.ID = "newButton";
PlaceHolder1.Controls.Add(txtBox);

} 现在运行它之后,在文本框中输入任何内容,看看当您单击任何导致回发的按钮时会发生什么。文本框仍然保持其状态!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多