2014-11-06 40 views
1

我的問題:

我有一個功能組框之內清除文本框和組合框(DropDownList)。雖然文本框正在清除,但無法清除組合框。GroupBox控件內清除/取消ComboBox控件(一個或多個)

我的代碼:

Public Sub ClearGroupControls() 
    For Each groupboxControl As Control In Me.Controls 
     If TypeOf groupboxControl Is GroupBox Then 
      For Each control As Control In groupboxControl.Controls 
       ' Clear controls 
       If TypeOf control Is TextBox Then 
        control.Text = "" 
       ElseIf TypeOf control Is ComboBox Then 
        'control.Text = String.Empty 
        'control.SelectedIndex = -1 
        control.Text = "" 
       End If 
      Next 
     End If 
    Next 
End Sub 

注:.SelectedIndex = -1產生錯誤:

SelectedIndex is not a member of System.Windows.Forms.Control

...這似乎不一致考慮control.Text工作時控制是一個TextBox。

+0

什麼是這些組合的DropDownStyle? – Steve 2014-11-06 17:30:52

+0

@Steve'DropDownList'。 – 2014-11-06 17:31:55

回答

2

循環控制集合返回一個沒有SelectedIndex屬性的通用控件。
你需要將其轉換爲適當的類型

Public Sub ClearGroupControls() 
    For Each groupboxControl In Me.Controls.OfType(Of GroupBox)() 
     For Each control As Control In groupboxControl.Controls 
      ' Clear controls 
      If TypeOf control Is TextBox Then 
       control.Text = "" 
      ElseIf TypeOf control Is ComboBox Then 
       Dim cbo = DirectCast(control, ComboBox) 
       cbo.SelectedIndex = -1 
      End If 
     Next 
    Next 
End Sub 

注意的是,在外環你可以使用IEnumerable的擴展需要通過在窗體的Controls集合枚舉返回類型分組框中的只是控制。

您可以在內環改爲兩個循環利用的OfType擴展,但如果真的提供了更好的性能這應該被測量(這在很大程度上取決於當前控件的數量在組框)

Public Sub ClearGroupControls() 
    For Each groupboxControl In Me.Controls.OfType(Of GroupBox)() 
     For Each txt In groupboxControl.Controls.OfType(Of TextBox)() 
      txt.Text = "" 
     Next 
     For Each cbo In groupboxControl.Controls.OfType(Of ComboBox)() 
      cbo.SelectedIndex = -1 
     Next 
    Next 
End Sub 
+0

它的工作原理,但我沒有消化你在暗示我可以用IEnumerable實現的功能。我研究了[官方概述](http://msdn.microsoft.com/en-us/library/vstudio/bb360913%28v=vs.100%29.aspx)和[「簡化」(如,根本沒有)概述](http://visualbasic.about.com/od/usingvbnet/a/ienumble.htm)但無濟於事。最終,你是否會說它會取代內部循環,此外,你會耐心/友好地指導我如何? – 2014-11-06 18:03:02

+1

嗯,我沒有權限解釋比發佈的兩個鏈接更好,但認爲'OfType'擴展類似於應用於Controls序列的過濾器,它只允許在括號內指定類型的對象到達'groupboxControl'變量。用這種方法你可以避免演員陣容。控件變量groupboxControl不再是通用控件,而是具有特定屬性的特定GroupBox控件 – Steve 2014-11-06 18:09:30

+1

在內部循環中,您需要檢查兩種不同類型的控件,因此不可能有一個循環OfType(????)。你可以編寫兩個循環,一個用於TextBoxes,另一個用於ComboBoxes,但我認爲你什麼也得不到。所以路線是有一個通用的控制,並且在Is返回true之後將其轉換爲ComboBox – Steve 2014-11-06 18:10:53