2012-03-11 53 views
-1

我在表單(144)上有很多按鈕需要刪除。他們的名字都以「R」開頭。所以我使用了這段代碼。刪除控件

Sub RemoveBookingButtons() 
    Dim cntrl As Control 

    For Each cntrl In Me.Controls 
     If Mid(cntrl.name, 1, 1) = "R" Then 
      Me.Controls.Remove(cntrl) 
     End If 
    Next 

End Sub 

但是每當我運行這個子函數時,它會刪除以「R」開頭的其他每個按鈕。有人可能會提出更好的代碼或指出該缺陷是在該代碼段還是隱藏在程序中的其他位置。

+1

你是指其他每個按鈕或其他控件?因爲在這個循環中你遍歷所有的控件(不僅僅是按鈕)。要迭代只有按鈕,你可以使用'For Each btn As Button In Me.Controls.OfType(Of Button)()' – Himal 2012-03-11 09:43:59

+0

你能解釋一下你的需求嗎? _「但是每當我運行這個子函數時,它都會刪除以'R'」_開頭的其他按鈕。我會假設這是你想要的行爲,不是嗎? – 2012-03-11 11:10:38

+0

@Tim Schmelter這意味着如果我有144個按鈕,它會刪除它們中的72個。再次運行例程,並刪除它們中的36個。所以如此。 – 2012-03-13 06:07:41

回答

0

您正在修改您正在迭代的集合,所以它肯定會出錯。我很驚訝它甚至運行。

您應該將所有匹配的控件檢索到一個新列表中,然後遍歷該列表,從第一個列表中刪除。

在C#:

var toRemove = this.Controls.Where(ctrl => ctrl.Name.StartsWith("R")).ToList(); 
foreach(var ctrl in toRemove) 
{ 
    this.Controls.Remove(ctrl); 
} 

在VB:

dim toRemove = (from c in Me.Controls where c.StartsWith("R") select c).ToList() 

for each ctrl in toRemove 
    Me.Controls.Remove(ctrl) 
next 
0

最小的方法來解決你的問題是使用for循環,而不是一個For Each,
從該月底開始控件集合如

For i = Me.Controls.Count -1 To 0 
    Dim cntrl as Control = Me.Controls(i) 
    If Mid(cntrl.name, 1, 1) = "R" Then 
     Me.Controls.Remove(cntrl) 
    End If 
Next 
2

不要更改Collection迭代期間。

你可以使用OfType找到所有你Buttons

Dim rButtons = Me.Controls.OfType(Of Button)(). 
    Where(Function(btn) btn.Name.StartsWith("R")).ToList() 
For Each btn In rButtons 
    Me.Controls.Remove(btn) 
Next 

澄清驗證碼:

一般來說,這是LINQ-to-Objects

Me.Controls.OfType(Of Button)() 

這將返回在窗體的ControlCollectionof Type Button所有控件。

.Where(Function(btn) btn.Name.StartsWith("R")) 

這限制了結果集中按鈕其中NameStartsWith「R」(注意,這是大小寫敏感的,你需要調用ToLower/ToUpper第一,如果希望它是情況insenstive)。

.ToList() 

這將創建從一個IEnumerable(OfButton)List(Of Button)。不是說任何LINQ查詢都會被延遲執行。 Deferred execution意味着表達式的評估被延遲直到其實際需要的值被實現。所以查詢不會實現,直到任何消耗它,在這種情況下ToList()它執行它並創建列表以及。

+0

嘿,你能解釋一下你的代碼的前兩行嗎?我知道你獲得了以R開頭的所有按鈕的列表,然後使用For循環刪除整個列表。 「Where」功能是什麼? – 2012-03-13 06:10:09

+0

@PejmanPoh:編輯我的答案來解釋一下代碼。看看鏈接tio獲取更多信息。 – 2012-03-13 08:15:35