c# – 在div id上使用FindControl时出错
我有一个ASP.NET站点,我试图通过C#代码隐藏文件中的ID访问div元素。 基本上我想看看是否存在div元素,如果存在,则改变其属性。
我发现很多资源都指向了十几个不同的解决方案,而且似乎都没有。
ASP.Net页面上的HTML:
Some Content Here Some Content Here Some Content Here
C#代码背后(我尝试过的例子):
System.Web.UI.HtmlControls.HtmlGenericControl div1 = (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("button1"); div1.Attributes["class"] = "classNameHere";
要么
Control div1 = this.FindControl("button1"); div1.GetType();
当代码到达上述每个示例的第二行时,我收到一个错误:
你调用的对象是空的。
如果我尝试以下方法:
if (div1 != null) { // Do Something; }
什么都没发生,因为div1总是设置为null。 具有讽刺意味的是,如果我查看Locals窗口并检查它,我可以在列表中看到按钮#id,所以我知道它们在那里,但是系统表现得好像没有找到控件。
我的最终目标是找到按钮div的最大ID#(查看我的html示例,最大id将是3(button3)。也许有更好的方法去做,但无论哪种方式,一旦我拥有我的max id,我希望能够触摸每个div并改变一些css属性。
虽然我可以通过jQuery轻松完成所有这些操作,但在本例中我需要在C#中执行此操作。
任何帮助深表感谢。 如果您需要更多信息,请告诉我们。
更新我从头开始创建一个新的C#Web项目。 添加母版页(而不是更改母版页)并使用母版页添加网页表单后,我只在内容ID =“Content2”下的网络表单中添加了一行:
从c#代码背后我仍然遇到与以前完全相同的问题。
最后的更新和回答我很震惊没有人(包括我自己)从上面的更新中抓住了我的错误。 当我在div下从头开始创建一个新项目时,我从未放过runat =“server”。 以下是我从头开始在新项目下解决问题的方法:
将runat =“server”添加到div:
然后我在MasterPage下的ContentPlaceHolder上做了一个FindControl:
ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
注意:这是ContentPlaceHolder代码在默认情况下创建的Site.Master页面上的样子:
在后面的代码中找到这个ContentPlaceHolder之后,我在这个占位符中搜索了button1:
using System.Web.UI.HtmlControls; HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");
最后,我检查myControl是否为null:
if (myControl != null) { \\ Do Something }
当我运行此代码时,它找到了我正在寻找的div。 以下是所有拼凑背后的完整代码:
using System.Web.UI.HtmlControls; ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1"); HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1"); if (myControl != null) { // Do Something }
如果您的页面使用的是MasterPage,则div控件将不在主控件集合中。 该集合仅包含指向MasterPage的ContentPlaceholder的Content控件。
有三种选择:
- 在Content控件上使用
FindControl
:contentControl.FindControl("button1");
- 执行递归
FindControl
直到找到所需的控件 - 通常,您的div控件的声明会添加到designer.cs代码隐藏中,因此您可以通过其名称直接访问该控件:
button1.Attributes["class"] = "classNameHere";
更新
我创建了一个MasterPage,向其添加了一个内容页面,并在内容页面中添加了
。
在我的内容页面的代码隐藏中,我添加了以下代码:
protected void Page_Load(object sender, EventArgs e) { var control = FindHtmlControlByIdInControl(this, "button1"); if (control != null) { control.Attributes["class"] = "someCssClass"; } } private HtmlControl FindHtmlControlByIdInControl(Control control, string id) { foreach (Control childControl in control.Controls) { if (childControl.ID != null && childControl.ID.Equals(id, StringComparison.OrdinalIgnoreCase) && childControl is HtmlControl) { return (HtmlControl)childControl; } if (childControl.HasControls()) { HtmlControl result = FindHtmlControlByIdInControl(childControl, id); if (result != null) return result; } } return null; }
这对我有用。
您需要将runat = server属性添加到要在后面的代码中访问的任何控件。 有关更多帮助,请参阅此文章。
从javascript和代码隐藏中访问
我似乎无法重现您的问题,DIV的任何机会都在模板控件中,例如UpdatePanel,Repeater或Grid?
如果你添加runat=server
请在div的最后添加:
这会奏效
但是,这不会
通过这样做,您可以修改代码隐藏中的任何属性:
divBtn.Style["display"] = "none";
这甚至与masterpages一起使用。 div不包含在母版页中。