1

我有一个网页,其中我使用简单的 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' 并在页面上呈现..

4

2 回答 2

3

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

于 2011-09-29T22:24:33.643 回答
1

亚当郁金香是现场。

要么将值存储在一个隐藏的文本框中,然后再发回。

或者

一种方法是使用 Web 服务器控件进行创建。(这是更难的工作)

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

那么对于动态控件,它们必须在 viewstete 恢复之前创建,因此在覆盖OnLoad事件中重新创建这些控件。

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

于 2011-09-29T22:37:58.860 回答