2011-03-09 100 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