【问题标题】:adding controls to asp .net form from the .cs file during runtime在运行时从 .cs 文件向 asp .net 表单添加控件
【发布时间】:2011-07-04 14:54:22
【问题描述】:

我有一个网站(使用 asp .net 构建),我想在运行时添加一些文字和图片(之前我不知道数量)。
用户选择参数后,单击一个按钮,该按钮调用以下代码(在 .cs 文件中):

foreach (var car in cars)
{
  Label lbl = new Label ();
  form1.Controls.Add(lbl);
  lbl.Text = car.name;
  Image myImage = new Image ();
  form1.Controls.Add(myImage);
  myImage.ImageUrl = car.imageURL;

}

但是当我运行代码时,我看不到页面上的控件。 我错过了什么吗?
谢谢!

【问题讨论】:

  • 您在页面生命周期的哪个阶段运行该代码?
  • 在回发事件处理阶段。

标签: asp.net controls runtime


【解决方案1】:

在设置属性之前,您必须将控件分配给表单。

例如:

foreach (var car in cars){  
  Label lbl = new Label ();
  form1.Controls.Add(lbl); // Create and immediately assign

  lbl.Text = car.name;  // now you can set some properties

  Image myImage = new Image ();
  form1.Controls.Add(myImage);  // Ditto

  myImage.ImageUrl = car.imageURL;
}

更新:

我刚刚创建了一个全新的 Web 应用程序项目,其页面上只有一个按钮;它按预期工作。我建议你有别的事情发生。见下文:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!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:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

    </div>
    </form>
</body>
</html>

以及背后的代码:

namespace WebApplication1 {
    public partial class _Default : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {

        }

        protected void Button1_Click(object sender, EventArgs e) {
            for (Int32 i = 0; i < 10; i++) {
                Label lbl = new Label();
                form1.Controls.Add(lbl);
                lbl.Text = "HAHAHAHAH";
            }
        }
    }
}

【讨论】:

  • 这不是真的,不管你是先设置属性还是添加控件之后。请参阅我的示例,它适用于两种文字控件。
  • @M4N:其实是真的。在将控件添加到层次结构之前,Viewstate 不会开始跟踪更改。因此,如果您在将其添加到层次结构之前设置了自定义值(如文本),那么 viewstate 将无法检测到您在重新水化时更改了它。对于这个例子,它应该无关紧要。但是,对于文本框等它会。我们遇到了动态创建表格并向其添加大量文本框和下拉列表的情况。直到我们在将新控件与容器关联之后进行属性分配之前,没有任何工作正常。
  • 我同意 ViewState - 但正如你所说,对于这个例子,它不是必需的。
  • @M4N:老鼠,陷入了我自己的逻辑循环......;)
【解决方案2】:

尝试在表单中添加占位符控件。然后代替调用 Form1.Controls.Add(....) 使用 PlaceHolder1.Controls.Add(.....)

【讨论】:

  • @menacheb,placeholder1 概念应该可以工作。我们多次使用它在运行时加载用户控件并将它们添加到占位符
【解决方案3】:

在 Web 窗体上创建动态控件时,必须在 OnInit 或 Page_Load 事件中创建控件并将其添加到控件集合中。

请参考this question 以解决您的问题。

【讨论】:

    【解决方案4】:

    你可以试试 AndyPeacock 所说的,但看看你的代码,我认为你需要研究的实际上是中继器和其他数据绑定控件,如 DataListView。

    下面是一个快速示例,说明如何使用中继器实现这一点:

    在您的 ASPX 文件中:

    <asp:Repeater ID="RepCars" runat="server">
        <ItemTemplate>
            <%# Eval("name") %>
            <img src='<% Eval("imageURL") %>' alt="" />
        </ItemTemplate>
    </asp:Repeater>
    

    在您的 .CS 部分,可能在 Page_Load 中:

       RepCarImages.DataSource = cars;
       RepCarImages.DataBind();
    

    看看http://www.w3schools.com/ASPNET/aspnet_repeater.asp

    【讨论】:

      【解决方案5】:

      不是答案,但以下精简示例对我有用:

      <%@ Page Language="C#" AutoEventWireup="true" %>
      <html>
      <head runat="server"></head>
      <body>
          <form id="form1" runat="server">
      
              <script runat="server">
              protected void Button1_Click(object sender, EventArgs e)
              {
                  var lit = new Literal();
                  Controls.Add(lit);
                  Controls.Add(new Literal() { Text = "aaaa" });
                  lit.Text = "some text -- ";
              }
              </script>
      
          <asp:Button ID="Button1" runat="server" Text="Button"
            onclick="Button1_Click" />
          </form>
      </body>
      </html>
      

      所以您似乎没有发布足够的信息来回答您的问题?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-06
        • 2011-11-07
        • 1970-01-01
        • 2014-08-13
        相关资源
        最近更新 更多