【问题标题】:How to dynamically render a control?如何动态呈现控件?
【发布时间】:2017-02-11 17:08:47
【问题描述】:

如何从后面的代码中的字符串在网页上呈现 asp.net 控件?

例如,假设我有下面的 aspx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="nrm.FRGPproposal.Questionnaire1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        //want to render a text box here
    </div>
    </form>
</body>
</html>

我可以在 Page_Load 事件中做什么来将 TextBox 呈现到 div 中?

protected void Page_Load(object sender, EventArgs e)
{
    //what do i do here to render a TextBox in the div from the aspx page?
}

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    注意这里可能存在编译问题。但基本上是在前面的代码中添加一个占位符控件。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:placeholder id="placeHolder" runat="server"/>
        </div>
        </form>
    </body>
    </html>
    

    然后以编程方式在后面的代码中创建一个TextBox。您需要包含 System.Web.UI 才能获取文本框。 然后将控件添加到placeHolder 上的控件集合中。以编程方式在文本框上设置您喜欢的任何属性

    protected void Page_Load(object sender, EventArgs e)
    {
        TextBox tb = new TextBox();
        placeHolder.Controls.Add(tb); //tb is referring to the name that you want to name your element. in this example given was TextBox. so the name of text box is tb. 
    
    }
    

    【讨论】:

    • 正如@Tehrab 在下面建议的那样,最好在页面初始化等早期生命周期时刻完成,而不是页面加载。
    • 你知道我如何像你一样从“System.Web.UI.WebControls.TextBox”这样的字符串创建一个新的TextBox对象吗?
    • 您是说您希望能够在 div 中的某个字符串的中间添加一个文本框吗?比如说你有字符串“输入名称 [System.Web.UI.WebControls.TextBox]”,并且希望将“[System.Web.UI.WebControls.TextBox]”呈现为 TextBox 控件?
    • 有点。我不需要您提到的字符串中的额外内容(“输入名称”)。基本上,我将从通过管理部分填充的数据库表中提取控制类型字符串。我可能只使用 switch/case 语句,因为可用控件的数量相对较少,但我很好奇是否有更简洁的方法。
    • 我明白了。您应该在文本框上使用 .GetType() 来获取字符串。然后您可以使用 typeof 关键字 (msdn.microsoft.com/en-us/library/58918ffs(VS.71).aspx) 并在从数据库中提取字符串时获取文本框的新实例。
    【解决方案2】:

    简单。

    为您的 div 元素添加两个属性:&lt;div runat="server" id="myDiv"&gt;&lt;/div&gt;

    然后

       TextBox tb = new TextBox();
       this.myDiv.Controls.Add(tb);
    

    如果你想渲染一个自定义的用户控件你可以使用上面的代码

      MyUserControl control  = (MyUserControl)Page.LoadControl("~/My_VirtualPathToControl");
      this.myDiv.Controls.Add(control);
    

    (您必须在 aspx 文件中注册您的控件)

    再想一想。 在 Page_Load 事件上执行代码时要小心。

    【讨论】:

      【解决方案3】:

      您还需要在 Page_Init 方法中重建控件,以便在 PostBack 上读取控件的状态/值。

      protected void Page_Init(object sender, System.EventArgs e)
      {
          TextBox tb = new TextBox();
          placeHolder.Controls.Add();
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多