c# - 在div id上使用FindControl时出错

时间:2012-07-10 15:41:04

标签: c# asp.net findcontrol

我有一个ASP.NET站点,我试图通过C#代码隐藏文件中的ID访问div元素。基本上我想看看是否存在div元素,如果存在,则改变其属性。

我发现很多资源都指向了十几种不同的解决方案,而且似乎都没有。

ASP.Net页面上的HTML:

<div class="contentArea">
     <div class="block" id="button1" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button2" runat="server">
            Some Content Here
     </div>
     <div class="block" id="button3" runat="server">
            Some Content Here
     </div>
</div>

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)。也许有更好的方法可以解决它,但无论哪种方式,一次我有我的最大ID,我希望能够触摸每个div并改变一些css属性。

虽然我可以通过jQuery轻松完成所有这些操作,但在本例中我需要在C#中执行此操作。

非常感谢任何帮助。如果您需要更多信息,请与我们联系。

更新 我从头开始创建一个新的C#web项目。添加母版页(而不是更改母版页)并使用母版页添加网页表单后,我只在内容ID =“Content2”下的网络表单中添加了一行:

<div id="button1"></div>

从c#代码背后我仍然遇到与以前完全相同的问题。

最终更新和答案 我很震惊没有人(包括我自己)从上述更新中抓住了我的错误。当我在div下从头开始创建一个新项目时,我从未放过runat =“server”。以下是我从头开始在新项目中解决问题的方法:

将runat =“server”添加到div:

<div id="button1" runat="server"></div>

然后我在MasterPage下的ContentPlaceHolder上做了一个FindControl:

ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");

注意:这是ContentPlaceHolder代码在默认情况下创建的Site.Master页面上的样子:

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>

在代码后面找到这个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
}

4 个答案:

答案 0 :(得分:11)

如果您的页面使用的是MasterPage,则div控件将不在主控件集合中。该集合仅包含指向MasterPage的ContentPlaceholder的Content控件。

有三种选择:

  1. 在内容控件上使用FindControlcontentControl.FindControl("button1");
  2. 在您找到所需的控件之前执行递归FindControl
  3. 通常,您的div控件的声明会添加到designer.cs代码隐藏中,因此您可以通过其名称直接访问该控件:button1.Attributes["class"] = "classNameHere";
  4. 更新

    我创建了一个MasterPage,为其添加了一个内容页面,并将<div id="button1" runat="server">Some text</div>添加到了内容页面。

    在我的内容页面的代码隐藏中,我添加了以下代码:

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

    这适合我。

答案 1 :(得分:0)

您需要将runat = server属性添加到要在后面的代码中访问的任何控件。请参阅此文章以获取更多帮助。

Accessing <div> from both javascript and code-behind

答案 2 :(得分:0)

我似乎无法重现您的问题,DIV的任何机会都在模板控件中,例如UpdatePanel,Repeater或Grid?

答案 3 :(得分:0)

如果您添加runat=server,请在div的最后添加:

这将有效

<div id="divBtn" class="mybuttonCass" runat="server">

但是,这不会

<div runat="server" id="divBtn" class="mybuttonCass">

通过这样做,您可以将代码隐藏中的任何属性修改为:

divBtn.Style["display"] = "none";

这甚至可以用于精通页面。 div不包含在母版页中。