2012-09-27 23 views
3

我有一個表單(Form1),它有30個控件。 當我點擊一個按鈕時,我想刪除這30個按鈕並將其他控件放在窗體上。 現在,我的問題是,這是緩慢的。刪除一組控件

我有我想要刪除的控件的列表,我用For Each對它們進行遍歷。

Private Sub ClearControls() 
    'removing the controls from Me.Controls 
    For Each Control As Control In ListToDelete 
     Me.Controls.Remove(Control) 
    Next 
    ListToDelete = New List(Of Control) 
End Sub 

現在,如果你看的形式,看到控制過得去1.刪除1這個動作需要約0.4秒(使用內置的秒錶計時),這就是太長。

是否有解決方案以更快的方式刪除控件,或者只能刪除控件1?

也許一個重要的事實是,一切都與數據庫連接。 這些控件是由我自己定義的類(TableDrawer)創建的,它創建一個矩形或圓形(取決於數據庫中的信息)。 我將自制控件添加到窗體中,當我想要刪除它們時,需要0.4秒才能獲取窗體上的其他控件 - 也包含信息超出我的數據庫。

希望這清除了一些東西,我希望你能幫助我......它真的有走快一點(我希望能得到0.1秒或更低)

+0

但我不想刪除所有的控件。有一些按鈕誰不能被刪除... – Vella

+0

我測試了你的解決方案,只是爲了檢查它是否更快,然後我的解決方案,它同樣快(讀:慢)...所以我認爲我不能去任何現在我快了。 – Vella

回答

4

首先隱藏面板似乎使控件比清除面板更快消失。看到此代碼:

Option Strict On 

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Panel1.Visible = False 

     If Not Panel1.Controls.OfType(Of Button).Any() Then 
      For x As Integer = 1 To 10 
       For y As Integer = 1 To 10 
        Dim btn As New Button() 
        btn.Size = New Size(45, 45) 
        btn.Location = New Point((x - 1) * 45, (y - 1) * 45) 
        btn.Text = (x * y).ToString() 
        Panel1.Controls.Add(btn) 
        btn.Visible = True 
       Next 
      Next 
     End If 

     Panel1.Visible = True 
    End Sub 

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     Panel1.Visible = False 
     Panel1.Controls.Clear() 
     Panel1.Visible = True 
    End Sub 
End Class 

此代碼具有2個按鈕和麪板。 Button1生成100個按鈕,將它們放置在面板上。在刪除它們之前,Button2隱藏面板。也許你可以嘗試這個想法。

+0

它的作品!非常感謝你!現在需要0.14s,這比我從我的解決方案中得到的0.4要好得多。 – Vella

2

這不是傾向於刪除花時間 - 每次都在重繪表單。試着用電話給刪除代碼周圍,以SuspendLayoutResumeLayout

Private Sub ClearControls() 
    'removing the controls from Me.Controls 
    Me.SuspendLayout() 
    For Each Control As Control In ListToDelete 
     Me.Controls.Remove(Control) 
    Next 
    Me.ResumeLayout() 
    ListToDelete = New List(Of Control) 
End Sub 
+0

我試圖添加2行代碼,但它並沒有改變一件事:控件被一個1刪除,並且它仍然需要大約0.4秒將它們全部刪除。 – Vella

1

把控制面板中的容器控件。卸下面板容器將刪除所有子控件。

+0

將它們添加到面板容器中並沒有多大幫助:我仍然可以看到控件被刪除,並且與以前一樣慢。 – Vella

+0

@Vella - 如果在移除控件之前隱藏了面板,該怎麼辦? –

+0

U1199880建議您刪除刪除每個單獨控件的父面板INSTEAD。 –

0

好心從未使用刪除和panel.removeat刪除任何控件。它將無法刪除面板佈局中的最後一個控件。特別是對於panel.removeat,一旦刪除面板中的最後一個控件,將返回索引錯誤。我也想知道爲什麼需要知道這是什麼問題?

將所有控件名稱存儲在字符串數組中,在面板中找到這些控件並將其刪除,嘗試下面的代碼將幫助您刪除面板中的所有控件。嘗試使用find和removeBykey函數將使您的任務更輕鬆。

Dim ctrllist() as string 
Dim counts = 0 

For each control in Me.panel1.controls 
redim Preserve ctrllist(0 to counts) 
ctrllist(counts)=control.name 
counts+=1 
Next 

For counts=Lbound(ctrllist) to Ubound(ctrlllist) 
    If me.panel1.controls.find(ctrllist(counts),True).Length>0 then 

    me.panel1.controls.removeBykey(ctrllist(counts)) 

    End If 
Next 

希望這將有助於。

0

謝謝user1884888!這項技術可以幫助我。

如果我使用Me.ScrollPanelControl.Controls.Clear(),那麼應用程序無響應,並且沒有選擇從任務管理器終止它,但使用這種技術可以幫助我。

這段代碼是爲了幫助一個人有同樣的問題。

   While (True) 
        Dim count = Me.ScrollPanelControl.Controls.Count 
        If count <= 0 Then 
         Exit While 
        End If 
        Dim firstCtrl = CType(Me.ScrollPanelControl.Controls(0), MyControl) 
        If Not firstCtrl.IsMoving Then 
         If Me.ScrollPanelControl.Controls.Find(firstCtrl.Name, True).Length > 0 Then 
          Me.ScrollPanelControl.Controls.RemoveByKey(firstCtrl.Name) 
         End If 
        ElseIf count > 1 Then 
         firstCtrl = CType(Me.ScrollPanelControl.Controls(1), MyControl) 
         If Me.ScrollPanelControl.Controls.Find(firstCtrl.Name, True).Length > 0 Then 
          Me.ScrollPanelControl.Controls.RemoveByKey(firstCtrl.Name) 
         End If 
        Else 
         Exit While 
        End If 
       End While