制作日历比使用标签更好的方法是什么?

时间:2013-07-17 16:35:06

标签: vb.net winforms calendar labels

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

要做到这一点,我使用了一个表格布局面板,有42个单独的单元格。在每个单元格中都有一个名为lblDay1lblDay2等的标签

当我加载页面时,标签全部写入当月的正确数字。

 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

不幸的是,加载速度非常慢。任何人都可以建议更快的方法。

2 个答案:

答案 0 :(得分:1)

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

据我所知,这是一个非常简单的GUI,控件数量少,算法要求不高(大量/长循环是导致GUI更新问题的主要原因),您可能会接受性能甚至不依赖于多线程。在你的情况下,我会做以下事情:

  1. 一个容器(您正在使用的TableLayoutPanel或其他东西 更简单,如Panel),包括开头的所有标签。在 没有太乱的情况(似乎并非如此, 只有42个标签)我会将它们包含在“设计视图”中 (而不是在运行时)。
  2. 根据给定月份填充所有标签的功能。
  3. “过渡效应” 每次用户选择不同月份时调用的容器。 您可以通过Timer重新定位来轻松完成此任务 容器(例如,当按钮被点击容器的位置时 设置在表单之外,然后逐渐返回(每个20分 10毫秒 - >制作数字)直到回到原来的位置。)
  4. 同步上述两点:标签的值 转换开始时将开始改变;以这种方式用户 什么都不会注意到(只是一个很吸引人的过渡 每个月)。
  5. 此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设置为减去面板的宽度,而不是零,它完全超出了形式。)

答案 1 :(得分:0)

如果您对加速代码纯粹感兴趣,我建议同时在多个线程上运行加载代码。根据您的应用需求,这可能是过度的,但这是一种很好的编码方式。作为旁注,所以程序看起来对于最终用户来说更加光滑,我建议总是在单独的线程上运行耗时的过程。

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