【发布时间】: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