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 つずつ削除されていることがわかります。このアクションには約 0.4 秒かかり (組み込みのストップウォッチで計測)、長すぎます。

コントロールをより速く削除する解決策はありますか、それともコントロールを 1 つずつ削除することしかできませんか?

おそらく重要な事実は、すべてがデータベースに接続されているということです。コントロールは、私が自分で定義したクラス (TableDrawer) によって作成され、長方形または円を作成します (データベースからの情報によって異なります)。自作のコントロールをフォームに追加し、それらを削除したい場合、フォーム上の他のコントロールを取得するのに0.4秒かかります-データベースからの情報も含まれます。

うまくいけば、これでいくつかの問題が解決し、あなたが私を助けてくれることを願っています...本当にもう少し速くなる必要があります(0.1秒以下になることを願っています)

4

5 に答える 5

6

最初にパネルを非表示にすると、パネルをクリアするよりもコントロールが早く消えるようです。このコードを参照してください:

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 個のボタンを生成し、それらを Panel に配置します。Button2 は、パネルを削除する前にパネルを非表示にします。おそらく、このアイデアを試すことができます。

于 2012-09-27T14:35:24.427 に答える
2

時間がかかるのは削除ではなく、毎回フォームを再描画することです。SuspendLayoutとの呼び出しで削除コードを囲んでみてくださいResumeLayout

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
于 2012-09-27T13:24:53.260 に答える
1

コントロールをパネル コンテナー コントロールに配置します。パネル コンテナーを削除すると、すべての子コントロールが削除されます。

于 2012-09-27T13:25:31.443 に答える
1

remove および panel.remoeat を使用してコントロールを削除しないでください。パネル レイアウトの最後のコントロールを削除することはできません。特に 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

それが役立つことを願っています。

于 2013-08-19T15:21:14.667 に答える
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
于 2013-09-17T08:20:14.397 に答える