winforms 想要使用Label显示排序计数器来显示处理进度

u3r8eeie  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(93)

这是一个标签打印应用程序。希望通过一个标签中显示的计数器显示进度。即希望它看起来像这样... 1000增量到1001增量到1002,1003等。非常简单的pgm,所以很明显,从开始到结束的处理是即时的。因此,结束号码弹出的权利,而不是 Flink 的排序序列。不需要数字是可读的,而只是模拟过程。因为它是一个打印程序,有时间显示。2在处理结束时,最后的数字应该在屏幕上。3我想也许我可以在更新标签之前用计时器来计时。4我的编码显然是不正确的。5在这里。6任何建议都将不胜感激。我是一个79岁的修补程序员(工作早在COBOL的日子),所以要善良LOL。

Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click

    ' Print button
    Dim toPrint As Integer = Me.NumericUpDown2.Value
    Dim RetVal As Object
    Dim TopPos As String = "375,200"
    Dim InfoPos As String = "360,260"
    startNo = TextBox2.Text
    For index As Integer = 1 To toPrint
        RetVal = RDP.PrintRawData("^XA^LL450^PQ" & arrCust(4) & "^CFB,30^FO" & TopPos & "^FD" & arrCust(5) & StartNo & "^FS^FO" & InfoPos & "^FD" & arrCust(2) & "^FS^XZ")
        Timer1.Interval = 1000
        Timer1.Start()
        startNo += 1
    Next
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Label4.Text = startNo
End Sub
muk1a3rh

muk1a3rh1#

问题是循环永远不会将控制权交还给底层的windows事件消息泵,因此在所有操作完成之前,永远没有机会处理任何paint消息来重绘标签。
要解决这个问题,我们首先需要解决两个冲突的语句:
从开始到结束是瞬间的
以及
由于这是一个打印程序,因此有时间进行此显示。

  • 这两个陈述中只有一个是真的。* 它们是相互排斥的。

如果第一条语句为真,我会将计时器更改为更频繁地计时(每200毫秒左右;更快只是浪费),并在循环中忍受一个丑陋的Application.DoEvents调用,这样标签就有机会重画。(另外:在进入循环之前启动定时器 * 一次 *,而不是在每次迭代时启动)。
如果后一种说法是正确的,我将重复关于避免Application.DoEvents的常见警告(这个方法有很多“陷阱”),相反,我将以正确的方式来做,并使用BackgroundWorker component

相关问题