【问题标题】:Speed up my function - Dynamic button creation vb.net加快我的功能 - 动态按钮创建 vb.net
【发布时间】:2026-01-13 07:10:01
【问题描述】:

我有一个基于数据库表动态创建按钮的功能,里面大约有 250 条记录。一切正常,但我想让它更快,但我不知道如何。

也许是因为我不懂语言。

实际上,在我的开发机器上,加载大约需要 56 秒。我不是经验丰富的开发人员,所以也许我遗漏了一些东西。

问题在于,在只有 4Go 内存的客户端机器上,加载时间要长得多,为 2.5 到 3.5 分钟。

感谢您的帮助。

这是我的代码:

Public Sub LoadProducts()

    Me.ProgressBar1.Value = 0
    Me.ProgressBar1.Visible = True

    Dim oSim As New SimFonction
    Dim str As String = "SELECT * FROM produits ORDER BY ref;"
    Dim oCmd As New MySqlCommand(str, oSim.ConnectDb)
    Dim oData As New DataSet
    Dim oAdapt As New MySqlDataAdapter With {
        .SelectCommand = oCmd
    }
    oAdapt.Fill(oData)
    oSim.conn.Close()
    recCount = oData.Tables(0).Rows.Count
    Dim btn(recCount) As Button
    Dim x, y, j As Integer
    oAdapt = Nothing
    oCmd = Nothing
    str = Nothing

    Dim ref As String
    x = 0
    y = 0
    Dim valeurIncr As Integer = 100 / recCount
    valeurBar = 0
    i = 0


    For i = 0 To oData.Tables(0).Rows.Count - 1
        If Me.ProgressBar1.Value >= 90 Then
            Me.ProgressBar1.Value = 0
        End If
        If j = 5 Then
            y += 90
            j = 0
            x = 0
        End If
        x += 90
        btn(i) = New Button With {
            .Parent = productPanel,
            .Location = New Point(x, y),
            .Height = 90,
            .Width = 90,
            .Font = New Font("Microsoft Sans Serif", 14, FontStyle.Bold),
            .ForeColor = Color.Orange,
            .UseVisualStyleBackColor = True,
            .TextAlign = ContentAlignment.BottomCenter
        }
        ref = oData.Tables(0).Rows(i).Item("ref").ToString

        If IsDBNull(oData.Tables(0).Rows(i).Item("photo")) Then
            btn(i).Text = oData.Tables(0).Rows(i).Item("ref").ToString
            btn(i).Tag = oData.Tables(0).Rows(i).Item("ref").ToString
            btn(i).Name = "bt" & ref
        Else
            Dim photoP As New IO.MemoryStream(CType(oData.Tables(0).Rows(i).Item("photo"), Byte()))
            btn(i).BackgroundImage = Image.FromStream(photoP)
            btn(i).BackgroundImageLayout = ImageLayout.Stretch
            btn(i).Tag = oData.Tables(0).Rows(i).Item("ref").ToString
            btn(i).Text = oData.Tables(0).Rows(i).Item("ref").ToString
            btn(i).Name = "bt" & ref
            photoP = Nothing
        End If

        If oSim.CheckProduiEnStock(ref) = False Then
            btn(i).Enabled = False
        End If
        AddHandler btn(i).Click, AddressOf ButtonClicked
        j += 1
        Me.ProgressBar1.Value += 1
        btn(i) = Nothing
    Next
    Me.ProgressBar1.Visible = False


End Sub

【问题讨论】:

  • 关于我唯一能看到的是您对 photoP 的内存流的处理。也许将其包装在 using 子句中。除此之外,其他一切似乎都非常简单。尝试单步执行您的代码以找出需要这么长时间的原因。您将需要检查进度条的使用情况。你在这里得到的东西可能不会像你想的那样工作。
  • 也许还可以尝试代码审查堆栈。可能更适合这类问题
  • 感谢您的建议,我今天会检查一下,如果情况更好,请告诉您。
  • 在每次迭代时重绘用户界面是一个主要的减速。 FlowPanel 可能会保存一些定位代码。注意@Miguel 的回答。

标签: vb.net performance button dynamically-generated


【解决方案1】:

您可以使用以下命令:

开头:Me.SuspendLayout(),和
最后:Me.ResumeLayout()

【讨论】: