在运行时从.cs文件向asp.net窗体添加控件

在运行时从.cs文件向asp.net窗体添加控件,asp.net,controls,runtime,Asp.net,Controls,Runtime,我有一个用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);

我有一个用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;

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

尝试在表单中添加占位符控件。然后,不调用Form1.Controls.Add。。。。使用占位符1.Controls.Add….

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


请参考以解决您的问题。

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

下面是一个如何使用中继器实现此功能的快速示例:

在您的ASPX文件中:

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

查看一下

在设置窗体属性之前,必须将控件分配给窗体

例如:

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";
            }
        }
    }
}

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

<%@ 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>

因此,您似乎没有发布足够的信息来回答您的问题?

在页面生命周期的什么时候运行该代码?在回发事件处理阶段。这不是真的,无论您是先设置属性还是在添加控件后设置属性。请参阅我的示例,它适用于两个文本控件。@M4N:事实上是这样的。在将控件添加到层次结构中之前,Viewstate不会开始跟踪更改。因此,如果在将文本添加到层次结构之前设置了自定义值(如文本),则viewstate将无法确定在重新水化时对其进行了更改。对于这个例子,这不重要。然而,对于文本框等,它会。我们在动态创建一个表并向其中添加大量文本框和下拉列表时遇到了这种情况。在将新控件与容器关联后进行属性分配之前,一切都不正常。我同意ViewState的说法-但正如您所说,在本例中,它不是必需的。@M4N:rats,陷入我自己的逻辑循环中@Menaheb,占位符1的概念应该有用。我们多次使用它在运行时加载用户控件,并将它们添加到占位符中
<%@ 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>