2012-09-27 3 views
3

양식 (Form1)이 있으며 컨트롤이 30 개 있습니다. 버튼을 눌렀을 때, 30 개의 버튼을 제거하고 다른 컨트롤을 폼에 추가하려고합니다. 내 문제는 이것이 느려지는 것입니다.컨트롤 컬렉션 제거

나는이 목록에 내가 삭제하고 싶은 컨트롤을 가지고 있으며, 각각을 위해 각각을 실행한다. 양식을 보면,

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 

지금, 당신은 컨트롤이 조치는 (빌드의 시간을 스톱워치로) 약 0.4 초를 소요하고 너무 오래의 1 씩 1을 삭제하기를 참조하십시오.

빠른 방법으로 컨트롤을 삭제할 수있는 솔루션이 있습니까? 아니면 컨트롤을 1 개씩 삭제할 수 있습니까?

중요한 사실은 모든 것이 데이터베이스와 연결되어 있다는 것입니다. 컨트롤은 자신이 정의한 클래스 (TableDrawer)로 만들어지며 직사각형 또는 원을 만듭니다 (데이터베이스의 정보에 따라 다름). 폼에 셀프 컨트롤을 추가합니다. 폼을 삭제하고 싶을 때 폼의 다른 컨트롤을 가져 오는 데는 0.4 초가 걸리고 데이터베이스의 정보도 함께 가져옵니다.

는 희망이 몇 가지를 지우고 난 당신이 나를 도울 수 있기를 바랍니다 ... 정말 빠른 비트를 가야

+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.14 초가 걸렸습니다. 0.4보다 훨씬 나은 솔루션이었습니다. – Vella

2

그것은 경향이 삭제 아니에요 (I은 0.1 초 이하를 얻을 수 있도록 노력하겠습니다) 시간이 걸릴 때마다 양식이 다시 그려집니다. 패널 컨테이너 컨트롤의 컨트롤을 넣어 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은 개별 컨트롤을 제거하는 대신 부모 패널을 제거하는 것이 좋습니다. –

0

친절하게도 컨트롤을 제거하려면 remove 및 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

고맙습니다. 사용자 1884888! 그 기술은 나를 돕는다.

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