Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 有什么比使用标签制作日历更好的方法?_Vb.net_Winforms_Calendar_Labels - Fatal编程技术网

Vb.net 有什么比使用标签制作日历更好的方法?

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

我已经在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

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

如果你纯粹想加速你的代码,我建议同时在多个线程上运行加载代码。根据您的应用程序需要,这可能有些过分,但这是一种编写代码的好方法。作为补充说明,对于最终用户来说,该程序看起来更流畅一些,我建议始终在单独的线程上运行此类耗时的进程


有关多线程的信息,请参阅本页:

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

我认为这是一个非常简单的GUI,控件数量少,算法要求不高(大量/长循环是GUI刷新问题的主要原因),即使不依赖多线程,您也可能获得可接受的性能。在你的情况下,我会做以下工作:

  • 容器(您正在使用的
    TableLayoutPanel
    或其他东西 更简单,如一个
    面板
    ),在开始时包含所有标签。在里面 不太乱的情况(似乎不是这样的情况, 只有42个标签)我会将它们包括在“设计视图”中 (而不是在运行时)
  • 根据给定月份填充所有标签的函数
  • “过渡效应” 每次用户选择不同的月份时调用的容器。 通过
    计时器
    重新定位 容器(例如,当点击按钮时,容器的位置 设置在表格外,然后逐渐恢复(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
    设置为减去面板宽度,而不是设置为零,它将完全超出窗体的范围)。

    VB.NET没有
    MonthCalendarControl
    吗?或者,首先,我同意上面的建议。但如果你想自己做(为了好玩或工作或其他什么),我的问题是:你什么时候/多少次调用此代码来创建标签?
    制作日历的更好方法是什么?
    -使用不推荐使用的.Net Windows UI技术(WPF)并使用
    项控件
    ,或者可能是一个
    列表框
    @Brian是的,有一个内置的月历。但我只想说,它并不能完全满足我的要求。所以我在建我自己的房子。@varocarbas它会在你改变月份的时候被调用。但它并没有创建标签。它只是在写已经存在的标签。创建它们会更快吗?谢谢。我不太明白第三点。你能写一些代码来说明你的意思吗?我已经运行了你给出的示例。但我真的看不出过渡效应的意义。为什么不将标签保留在当前位置?@Urbycoz当从一个月变到另一个月时,这一点显示了一种过渡。请记住,我的代码中的一个非常慢,您可以做得更快(1毫秒而不是100毫秒,或者1000点而不是100)。标签每次都会出现在面板中,但是当您更改月份时,如果面板移动(甚至非常快)可能会更好,这可能会隐藏标签值刷新的最终延迟。实际上,这是在内置MonthCalendar(更好的版本)中完成的。这只是一个建议的功能,我会包括,你不需要包括一切。啊,我明白了。你比我领先得多。我现在正赶上。