2011-03-09 36 views
2

每个控制在Page.Header.ControlsASP.NET如何做For循环与控制

我怎么可以这样做如上,此刻得到错误 “控制是一个类型,不能使用为表达”

的完整代码如下

Try 
     ' I only do this on my production servers, so I declare those here.' 
     If Request.ServerVariables("server_name") = "www.myproductionurl.com" Then 
      ' Allow scripts and css to logged in CMS users' 

      Dim checkLogin As New Controls.Login 
      If checkLogin.IsLoggedIn <> True Then 
       For Each Control In Page.Header.Controls 
        If Control.GetType.Name = "EktronJsControl" Or Control.GetType.Name = "EktronCssControl" Or Control.GetType.Name = "EktronModalCss" Then 
         Page.Header.Controls.Remove(Control) 
        Else 
         ' Removes the extra bubble inline style stuff that wasn't put in a CSS.'' 
         Dim litControl As LiteralControl = Control 
         If litControl.Text = Nothing Then 
          litControl.Text = "" 
         End If 

         ' Removing blank.css file' 
         Dim htmlLink As HtmlLink = Control 
         If htmlLink.Href = "/css/blank.css" Then 
          Page.Header.Controls.Remove(Control) 
         End If 
        End If 
       Next 
      End If 
     End If 
    Catch ex As Exception 

    End Try` 

回答

1

变化Control变量名称到别的东西。

For Each ctrl In Page.Header.Controls 

For Each ctrl As Control In Page.Header.Controls 

错误消息说,这一切:这个词ControlType所以你需要使用别的东西。

UPDATE回复评论。

当您使用For Each循环遍历它们时,您无法删除控件。

考虑代码更改为类似:

For i as Integer = Page.Header.Controls.Length -1 to 0 Step -1 
    Dim ctrl As Control = CType(Page.Header.Control(i),Control) 

    If ctrl.GetType.Name = "EktronJsControl" Or ctrl.GetType.Name = "EktronCssControl" Or ctrl.GetType.Name = "EktronModalCss" Then 
     Page.Header.Controls.Remove(ctrl) 
    Else 

     Dim litControl As LiteralControl = ctrl 
     If litControl.Text = Nothing Then 
      litControl.Text = "" 
     End If 

    End If 
Next 

,你可以继续被移除以控件的引用,并在循环后删除。

Dim removables = New List(Of Control) 

For Each ctrl In Page.Header.Controls 
    If ctrl.GetType.Name = "EktronJsControl" Or ctrl.GetType.Name = "EktronCssControl" Or ctrl.GetType.Name = "EktronModalCss" Then 
     removables.Add(ctrl) 
    Else 

     Dim litControl As LiteralControl = ctrl 
     If litControl.Text = Nothing Then 
      litControl.Text = "" 
     End If 

    End If 
Next 

For Each c In removables 
    Page.Header.Controls.Remove(c) 
Next 

而且,其不太可能ctrl将能够被转换成LiteralControlHtmlLink,所以你需要添加额外的检查,以确定它是。

+0

试过,但得到以下错误收集被修改;枚举操作可能不会执行。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。 异常详细信息:System.InvalidOperationException:集合已被修改;枚举操作可能不会执行。 源错误:230 行:结束如果 行231:结束如果 行232:下一步 233线:结束如果 行234: – StevieB 2011-03-09 15:27:49

+0

@StevieB - 那是因为你正试图删除从'头中的控制。控制“,同时仍然遍历它们。您无法删除'For Each'循环中的控件 – 2011-03-09 15:30:20

+0

@StevieB - 您可以保留对要删除的控件的引用(例如在另一个列表中),然后在“For Each”循环后全部删除它们。或者你可以使用一个普通的'For'循环向后('我为Integer = Page.Header.Controls.Length -1到0步-1'),并在那里删除它们。 – 2011-03-09 15:33:28

2

不幸的是...... VB.NET编译器说你不能使用“Control”作为变量名,因为“Control”也是一种类型!

只需使用另一个标识符:)

0

首先,我想说我很抱歉,你有晔的工作:(。我觉得你的痛苦。

您的循环的语法是错误的,你需要指定一个变量的循环的语法是:

For Each [variable] As [type] In [collection] 

所以,你的循环更改为:

For Each ctrl as Control In Page.Header.Controls 

并将代码中变量Control的所有参考更改为ctrl

欲了解更多信息,请参阅For Each上的MSDN article

+0

vb.net不区分大小写,所以这不起作用。你需要一个完全不同的变量名称。 – 2011-03-09 15:10:00

+0

好的电话,应该知道的。 – wsanville 2011-03-09 15:11:26

1

由于“Control”是一个类,因此它不能用作变量名。将其更改为另一个变量名,或将其置于方括号中... [Control]

括号将告诉编译器将其视为变量而不是类名。

0

列举要枚举并删除它们后删除的控件。

Dim controlsToRemove As New List(Of Control) 
For Each ctrl In Page.Header.Controls 
    If ctrl.GetType.Name = "EktronJsControl" Or ctrl.GetType.Name = "EktronCssControl" Or ctrl.GetType.Name = "EktronModalCss" Then 
     Page.Header.Controls.Remove(ctrl) 
    Else 

     Dim litControl As LiteralControl = ctrl 
     If litControl.Text = Nothing Then 
      litControl.Text = "" 
     End If 

     Dim htmlLink As HtmlLink = ctrl 
     If htmlLink.Href = "/css/blank.css" Then 
      'Page.Header.Controls.Remove(ctrl) 
      controlsToRemove.Add(ctrl) 
     End If 
    End If 

Next 

For Each ctrlToRemove In controlsToRemove 
    Page.Header.Controls.Remove(ctrlToRemove) 
Next