动态创建的文本框c#

时间:2017-03-07 16:23:52

标签: c# asp.net

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

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 个答案:

答案 0 :(得分:1)

处理 动态创建控件 的主要问题是您需要在 Page Init 中重新加载它们或 页面加载 事件。

仅供参考: 我们通常使用Panel或PlaceHolder来加载控件而不是Body标签,以便我们可以轻松设置它们的样式。 < / p>

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" />
        <br />
        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);
    }
}

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