0

我在 VB.net 中创建了自己的 winforms 月视图日历。

为此,我使用了一个表格布局面板,其中包含 42 个单独的单元格。在每个单元格中都有一个名为lblDay1,lblDay2等的标签。

当我加载页面时,标签都被写入了那个月的正确数字。

 Dim daysInMonthCnt As Integer =31 'Assume 31 days for now
 Dim firstDay As Integer = Weekday("1/" & Now.month & "/" & Now.year) 'Get weekday for 1st of month
 For dayCount As Integer = firstDay To daysInMonthCnt
    Dim lbl As Label
    lbl = CType(pnlMonthBody.Controls("lblDay" & dayCount), Label)
    lbl.Text = dayCount 'Write to label
 Next dayCount

不幸的是,事实证明加载速度非常慢。任何人都可以请提出一个更快的方法。

4

2 回答 2

1

仅将值写入如此少量的标签是一个非常快速的过程。您遇到的问题很可能与刷新 GUI 控件内容时的 VB.NET“问题”有关;正如 FraserOfSmeg 所建议的,解决此问题的最佳方法是研究多线程。

就我而言,这是一个非常简单的 GUI,具有少量控件和不太苛刻的算法(大量/长循环是 GUI 刷新问题的主要原因),即使没有,您也可以获得可接受的性能依赖多线程。在您的情况下,我会执行以下操作:

  1. 一个容器(TableLayoutPanel您正在使用的或更简单的东西,例如 a Panel),包括开头的所有标签。如果不会变得太乱(似乎不是这样,只有 42 个标签),我会将它们包含在“设计视图”中(而不是在运行时)。
  2. 根据给定月份填充所有标签的函数。
  3. 每次用户选择不同的月份时,都会调用容器的“过渡效果”。您可以通过重新定位容器很容易地完成此操作Timer(例如,当单击按钮时,容器的位置设置在表单之外,然后逐渐返回(每 10 毫秒 20 点 -> 编造的数字)直到回到原来的位置位置)。
  4. 同步上述两点:标签的值将在过渡开始时开始变化;通过这种方式,用户不会注意到任何事情(只是每个月的一个非常吸引人的过渡)。

这个 GUI 应该提供您所追求的那种性能。如果没有,您应该依靠其他方法(例如,建议的多线程)来提高其性能。

说明第 3 点的示例代码

将面板 ( Panel1)、按钮 ( Button1) 和计时器 ( Timer1) 添加到新表单和下面的代码中。

Public Class Form1

    Dim curX, origX, timerInterval, XIncrease As Integer
    Dim moving As Boolean
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        If (curX >= origX) Then
            If (moving) Then
                curX = Panel1.Location.X
                moving = False
                Timer1.Stop()
            Else
                curX = 0 'getting it out of the screen
                moving = True
            End If
        Else
            curX = curX + XIncrease
        End If
        Panel1.Location = New Point(curX, Panel1.Location.Y)
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Timer1.Start()
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        XIncrease = 100
        timerInterval = 100
        Panel1.BackColor = Color.Maroon
        origX = Panel1.Location.X
        curX = origX
        With Timer1
            .Enabled = False
            .Interval = timerInterval
        End With

    End Sub
End Class

这非常简单,但清楚地表明了这个想法:当您单击按钮时,面板会在 X 中移动;通过影响timerIntervalXIncrease值,您可以获得漂亮的过渡(有很多选项,请记住,如果您设置curX为减去面板的宽度,而不是为零,它会完全超出表单)。

于 2013-07-18T07:54:38.137 回答
0

如果您纯粹对加速代码感兴趣,我建议您同时在多个线程上运行加载代码。根据您的应用程序需求,这可能有点矫枉过正,但它是一种很好的编码方式。作为旁注,因此该程序对于最终用户来说看起来更加流畅,我建议始终在单独的线程上运行诸如此类的耗时进程。

有关多线程的信息,请查看此页面:多线程教程

于 2013-07-18T03:14:07.447 回答