如何从asp.net中的代码访问动态创建的HTML控件

时间:2011-09-29 22:19:03

标签: asp.net image nullreferenceexception htmlcontrols

我有一个网页,其中我使用一个简单的foreach循环并创建表结构,其中我在td中显示图像,要求是我想访问在td中创建的图像,从页面加载的代码隐藏

但我无法找到控件,我已将控件设为runat ='server'并设置了id。

foreach (DataRow r in dtLogic.TopStories(Convert.ToInt32(ConfigurationManager.AppSettings["TopArticles"]), Convert.ToInt32(ConfigurationManager.AppSettings["PortalId"])).Rows)
        {
            i++;
            str.Append("<table cellpadding='0' cellspacing='0' class='newsItem'>");
            str.Append("<tr>");
            str.Append("<td><img runat='server' id='img"+i+"' class='thumb' src='" + GetAppSettingValue("MainSiteUrl") + "" + r["image"].ToString() + "' width='128' height='73'></td>");
            str.Append("<td><p class='newsTitle'><a href='" + r["URL"].ToString() + "'>" + r["title"].ToString() + "</a></p></td>");
            str.Append("<td><img class='arrow' src='/images/arrow.png'></td>");
            str.Append("</tr>");
            str.Append("</table>");
        }

现在,当我从后面的代码中访问此图像时,如下所示..

HtmlImage img = (HtmlImage)this.FindControl("img1");

我得到了img对象的NullReference ..

任何人都可以告诉我为什么它没有获取图像,这是runat ='server'并在页面上呈现..

2 个答案:

答案 0 :(得分:3)

您无法访问它,因为它在回发时不存在。图像控件不会回发到服务器。如果你必须将事件绑定到它(当它被点击时)你通常想要在page_init中创建控件并重新绑定它的事件以使动态控件起作用。

答案 1 :(得分:1)

Adam Tuliper是现场的。

将值存储在隐藏文本框中,该文本框将被回发。

执行此操作的方法是使用Web服务器控件创建。 (这是更难的工作)

Image img = new image()....
HtmlTable tabl = new HtmlTable()
HtmlTr ...
HtmlTd ...
td.Controls.Add(img);

使用动态控件,必须在视图返回之前创建它们,因此在覆盖OnLoad事件中重新创建这些控件。

(顺便说一句,你不能只将runat ='server'作为字符串添加到任何东西。检查你自己。在你的网页上查看源代码,你会在源代码中看到runat ='server'。任何其他服务器控件都没有视图源中的属性。)