我在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
不幸的是,加载速度非常慢。任何人都可以建议更快的方法。
答案 0 :(得分:1)
将值写入如此少量的标签是一个非常快速的过程。在刷新GUI控件的内容时,您遇到的问题最有可能与VB.NET“问题”有关;解决这个问题的最佳方法是研究FraserOfSmeg建议的多线程。
据我所知,这是一个非常简单的GUI,控件数量少,算法要求不高(大量/长循环是导致GUI更新问题的主要原因),您可能会接受性能甚至不依赖于多线程。在你的情况下,我会做以下事情:
TableLayoutPanel
或其他东西
更简单,如Panel
),包括开头的所有标签。在
没有太乱的情况(似乎并非如此,
只有42个标签)我会将它们包含在“设计视图”中
(而不是在运行时)。 Timer
重新定位来轻松完成此任务
容器(例如,当按钮被点击容器的位置时
设置在表单之外,然后逐渐返回(每个20分
10毫秒 - >制作数字)直到回到原来的位置。)此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中移动;通过影响timerInterval
和XIncrease
值,您可以获得漂亮的转换(有很多选项,请记住,如果将curX
设置为减去面板的宽度,而不是零,它完全超出了形式。)
答案 1 :(得分:0)
如果您对加速代码纯粹感兴趣,我建议同时在多个线程上运行加载代码。根据您的应用需求,这可能是过度的,但这是一种很好的编码方式。作为旁注,所以程序看起来对于最终用户来说更加光滑,我建议总是在单独的线程上运行耗时的过程。
有关多线程的信息,请查看此页面:Mutlithreading tutorial