Vb.net 有什么比使用标签制作日历更好的方法?
我已经在VB.net中创建了自己的winforms月视图日历 为此,我使用了一个表格布局面板,有42个单独的单元格。在每个单元格中都有一个名为Vb.net 有什么比使用标签制作日历更好的方法?,vb.net,winforms,calendar,labels,Vb.net,Winforms,Calendar,Labels,我已经在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.ye
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
不幸的是,加载速度非常慢。任何人都可以建议一种更快的方法。如果你纯粹想加速你的代码,我建议同时在多个线程上运行加载代码。根据您的应用程序需要,这可能有些过分,但这是一种编写代码的好方法。作为补充说明,对于最终用户来说,该程序看起来更流畅一些,我建议始终在单独的线程上运行此类耗时的进程
有关多线程的信息,请参阅本页:只需将值写入如此少量的标签,这是一个非常快速的过程。您遇到的问题很可能与刷新GUI控件内容时的VB.NET“问题”有关;解决这个问题的最好方法是研究多线程,正如FraserOfSmeg所建议的那样 我认为这是一个非常简单的GUI,控件数量少,算法要求不高(大量/长循环是GUI刷新问题的主要原因),即使不依赖多线程,您也可能获得可接受的性能。在你的情况下,我会做以下工作:
TableLayoutPanel
或其他东西
更简单,如一个面板
),在开始时包含所有标签。在里面
不太乱的情况(似乎不是这样的情况,
只有42个标签)我会将它们包括在“设计视图”中
(而不是在运行时)李>
计时器
重新定位
容器(例如,当点击按钮时,容器的位置
设置在表格外,然后逐渐恢复(20分/秒)
10毫秒->组合数字),直到回到其原始位置)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
设置为减去面板宽度,而不是设置为零,它将完全超出窗体的范围)。VB.NET没有MonthCalendarControl
吗?或者,首先,我同意上面的建议。但如果你想自己做(为了好玩或工作或其他什么),我的问题是:你什么时候/多少次调用此代码来创建标签?制作日历的更好方法是什么?
-使用不推荐使用的.Net Windows UI技术(WPF)并使用项控件
,或者可能是一个列表框
@Brian是的,有一个内置的月历。但我只想说,它并不能完全满足我的要求。所以我在建我自己的房子。@varocarbas它会在你改变月份的时候被调用。但它并没有创建标签。它只是在写已经存在的标签。创建它们会更快吗?谢谢。我不太明白第三点。你能写一些代码来说明你的意思吗?我已经运行了你给出的示例。但我真的看不出过渡效应的意义。为什么不将标签保留在当前位置?@Urbycoz当从一个月变到另一个月时,这一点显示了一种过渡。请记住,我的代码中的一个非常慢,您可以做得更快(1毫秒而不是100毫秒,或者1000点而不是100)。标签每次都会出现在面板中,但是当您更改月份时,如果面板移动(甚至非常快)可能会更好,这可能会隐藏标签值刷新的最终延迟。实际上,这是在内置MonthCalendar(更好的版本)中完成的。这只是一个建议的功能,我会包括,你不需要包括一切。啊,我明白了。你比我领先得多。我现在正赶上。