2011-04-02 28 views
1

我有一个简单的ASP.Net页面,并且我通过控件通过反射对控件进行了枚举(本地化页面 - 但这是整个管理员指令的其他功能类型蠕虫)。所以...我有这样一个测试页面:asp.net窗体控件ID在枚举上为空

<%@ Page Title="" Language="C#" MasterPageFile="~/Master Pages/Root.master" AutoEventWireup="true" CodeFile="refelectiontest.aspx.cs" Inherits="refelectiontest" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 

    <asp:Button ID="Button1" runat="server" Text="Button" /> 

    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><asp:Label ID="Label2" 
     runat="server" Text="Label"></asp:Label> 

    <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label> 

</asp:Content> 

然后在后面的代码,我想通过控制迭代...

所以我有这个(母版页可以处理本身)

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 

      try 
      { 

       foreach (Control ctrl in Form.Controls) 
       { 
        if (ctrl is ContentPlaceHolder) 
        { 
         ContentPlaceHolder chp = ctrl as ContentPlaceHolder; 
         foreach (Control control in chp.Controls) 
         { 
       string strID = control.ID; 
       //do stuff based on the the ID 
         } 
        } 


       } 

      } 
      catch (Exception ex) 
      { 
       Response.Write(ex.ToString()); 
      } 
     } 

    } 

现在,如果我只是运行这个,它与对象空异常的barfs。如果我遍历代码,在control.ID行上放置一个断点,那么ID实际上是空的。但是,如果我然后扩展控制对象,则ID会自动填充,一切正常。

它看起来像ID只是在最后一刻才完成 - 我怎样才能确保我可以得到的ID不变空? 如果我不使用母版页,会发生同样的事情。 谢谢。

回答

0

你能试试吗?

 Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.ContentType = "text/plain"; 

     foreach (Control ctrl in this.Form.Controls) 
     { 
      //Response.Write("ID: " + ctrl.ID + "\n"); 
      //Response.Write("ClientID: " + ctrl.ClientID + "\n"); 
      if ((ctrl as ContentPlaceHolder) != null) 
      { 
       ContentPlaceHolder chp = ctrl as ContentPlaceHolder; 
       Response.Write("Content Found" + "\n"); 
       foreach (Control control in chp.Controls) 
       { 
        string strID = control.ID; 
        Response.Write("Control in content: " + strID + "\n"); 
        //do stuff based on the the ID 
       } 
      } 
     } 
     Response.End();` 

该代码输出ContentPlaceHolder中的ID。其中一些是空的,所以你需要过滤它。

希望这有助于

+0

'如果((Ctrl键的ContentPlaceHolder)!= NULL)'?真? – configurator 2011-04-02 16:25:10

+0

是的,试过了。它仍然获得空ID。我的解决方法是确保在使用ID进行某些操作之前检查了null - 证明所有对象的ID都是有效的。 – Manicguitarist 2011-04-04 12:04:59

1

我不知道这是否会有任何帮助,但你可以使用control.UniqueID。它对我来说工作得很好,而且我也有同样的错误,并且让我困扰了好几个小时。 下面是它的代码应该如何看根据我像:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 

     try 
     { 

      foreach (Control ctrl in Form.Controls) 
      { 
       if (ctrl is ContentPlaceHolder) 
       { 
        ContentPlaceHolder chp = ctrl as ContentPlaceHolder; 
        foreach (Control control in chp.Controls) 
        { 
      string strID = control.UniqueID; 
      //do stuff based on the the ID 
        } 
       } 


      } 

     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.ToString()); 
     } 
    } 

}