首页 文章

动态创建的文本框c#

提问于
浏览
1

我动态创建文本框,但无法从创建的文本框中检索值 . 任何人都可以向我解释我做错了什么?

HtmlGenericControl testes = new HtmlGenericControl("DIV");
    testes.ID = "Div_Cabos_Rede";
    testes.Attributes.Add("class", "col-md-12 letra");
    testes.InnerHtml = "Cabos de rede";
    TextBox Cabos_de_rede = new TextBox();
    Cabos_de_rede.ID = "Txt_Cabos_Rede";
    Cabos_de_rede.Attributes.Add("class", "col-md-12 form-control");
    testes.InnerHtml = "Cabos de rede";
    Body.Controls.Add(testes);
    Body.Controls.Add(Cabos_de_rede);

这工作得很好(很小的不相关的CSS问题),但后来我尝试从动态创建的文本框中检索数据我得到NULL值 .

这是我的代码来检索值:

TextBox testar = (TextBox)Body.FindControl("Txt_Cabos_Rede");
 ScriptManager.RegisterStartupScript(this, GetType(), "alert", "alert('" + testar + "');", true);

1 回答

  • 1

    处理 dynamically created control 的主要问题是你需要在 Page InitPage Load 事件中重新加载它们 .

    FYI: 我们通常使用Panel或PlaceHolder加载控件而不是Body标签,这样我们就可以轻松设置它们的样式 .

    ASPX

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DemoWebForm.Default" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:PlaceHolder runat="server" ID="PlaceHolder1" />
            <asp:Button runat="server" ID="SubmitButton" Text="Submit" OnClick="SubmitButton_Click" />
            
    Posted Value: <asp:Label runat="server" ID="ResultLabel" /> </form> </body> </html>

    代码背后

    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            HtmlGenericControl testes = new HtmlGenericControl("DIV");
            testes.ID = "Div_Cabos_Rede";
            testes.Attributes.Add("class", "col-md-12 letra");
            testes.InnerHtml = "Cabos de rede";
            TextBox Cabos_de_rede = new TextBox();
            Cabos_de_rede.ID = "Txt_Cabos_Rede";
            Cabos_de_rede.Attributes.Add("class", "col-md-12 form-control");
            testes.InnerHtml = "Cabos de rede";
            PlaceHolder1.Controls.Add(testes);
            PlaceHolder1.Controls.Add(Cabos_de_rede);
        }
    
        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            TextBox testar = FindControlRecursive(PlaceHolder1, "Txt_Cabos_Rede") as TextBox;
            ResultLabel.Text = testar.Text;
        }
    
        // Custom method to search a control recursively 
        // in case it is nested inside other control. 
        // You can create it as an extension method if you would like.
        public static Control FindControlRecursive(Control root, string id)
        {
            if (root.ID == id)
                return root;
    
            return root.Controls.Cast<Control>()
                .Select(c => FindControlRecursive(c, id))
                .FirstOrDefault(c => c != null);
        }
    }
    

    我知道你有很多问题 . 在评论这个问题之前,请创建一个新项目,并使这个非常简单的代码工作 .

相关问题