2011-05-25 64 views
1

我最近將VB 6項目升級爲.net。我遇到的代碼塊一個問題:轉換錯誤無效

Dim CtrlName As System.Windows.Forms.MenuItem 

    For Each CtrlName In Form1.Controls 

    'Some code here 

    Next CtrlName 

下面這段代碼編譯,但會引發以下運行時錯誤:

無法投類型的對象System.Windows.Forms.Panel「來鍵入'System.Windows.Forms.MenuItem。

我對主題表單有一個面板控件。我該如何解決這個問題? 謝謝。

+0

感謝@Konrad魯道夫 – 2011-05-28 11:33:34

回答

5

您正在遍歷全部直接位於表單內部的控件,而不僅僅是MenuItem s。但是,您的變量的類型爲MenuItem。這是造成這個問題的原因。

對於正常控制(例如Button S),你想使用下面,輕鬆搞定;循環控制類型是否正確內部測試:

For Each control As Control In Form1.Controls 
    Dim btt As Button = TryCast(control, Button) 
    If btt IsNot Nothing Then 
     ' Perform action 
    End If 
Next 

然而,這並不不是MenuItem小號工作,因爲這些都不是控制在所有的WinForms,他們不存儲在窗體的Controls採集。

您需要重複表單的Menu.MenuItems property

+0

的「控制」變量需要是Object類型來得到這個工作 – 2011-05-25 14:09:44

+0

@IainHoult不,這不是真的。 'Form1.Controls'的類型爲'ControlCollection',其中的每個元素都是'Control'。儘管'ControlCollection'只能從非泛型'ControlCollection'繼承,你可以使用'Control'變量遍歷它。 – 2011-05-25 14:13:09

+0

我把你的代碼放到Visual Studio中,它在TryCast上給了我下面的錯誤:「類型'System.Windows.Forms.Control'的值不能被轉換爲'System.Windows.Forms.MenuItem'」。對於類似於Button控件而不是MenuItem的項目來說沒關係! – 2011-05-25 14:26:31

1

表格的Controls屬性中的項目,可能是也可能不是MenuItem。假設你只是想遍歷MenuItem對象,你可以更改您的代碼:

For Each menuControl As MenuItem In Me.Controls.OfType(Of MenuItem) 
    ' Some code 
Next 

注意,menuControl變量在For宣佈所以只是塊內訪問並自動配置。

0
for each ctrl as control in me.controls 
if typeof ctrl is menuitem then 
    ' do stuff here 
end if 
next 

typeof關鍵字允許您測試控件集合中正在檢查的控件的類型。

經過一番研究後找到了答案,您需要先搜索菜單條,然後遍歷項目集合。

For Each ctrl As Control In Me.Controls 
    If TypeOf ctrl Is MenuStrip Then 
      Dim mnu As MenuStrip = DirectCast(ctrl, MenuStrip) 
      For Each x As ToolStripMenuItem In mnu.Items 
       Debug.Print(x.Name) 
      Next  
     End If 
    Next 
+0

這段代碼與我的基本相同,只不過更糟糕(您仍然需要在'TypeOf'測試之後進行投射,而'TypeOf' + cast則由'TryCast'代替)。無論如何,你的代碼失敗的原因與我的一樣:菜單項不存儲在窗體的控件集合中。 – 2011-05-25 14:40:30