Vb.net 标签不';t在Form.Refresh()上重新绘制

Vb.net 标签不';t在Form.Refresh()上重新绘制,vb.net,winforms,events,Vb.net,Winforms,Events,我有一个表单,在绘画事件中,一些带有信息的标签被画在一个面板内——这很好用。但是,我希望标签上的文本根据放置在同一表单上的轨迹栏的值进行更改。这是应刷新整个表单的轨迹栏滚动事件: Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll Me.Refresh() End Sub 这是在表单上绘制标签的代码: Public Sub Form_Paint(sender A

我有一个表单,在绘画事件中,一些带有信息的标签被画在一个面板内——这很好用。但是,我希望标签上的文本根据放置在同一表单上的轨迹栏的值进行更改。这是应刷新整个表单的轨迹栏滚动事件:

 Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    Me.Refresh()
End Sub
这是在表单上绘制标签的代码:

Public Sub Form_Paint(sender As Object, e As PaintEventArgs)

    For i = 0 To 10

        Dim tb As New Label

        tb.Name = "tb" & CStr(i)
        If Me.TrackBar1.Value = 1 Then tb.Text = "sometext"
        If Me.TrackBar1.Value = 0 Then tb.Text = "anothertext"

        tb.Location = New Point(i, i * 2)

        Me.Panel1.Controls.Add(tb)

    Next
End Sub

但是,无论轨迹栏处于何种状态,标签中显示的文本始终是“另一个文本”。当我更改轨迹栏的值时,就我所知会触发绘制事件,但如何强制标签更新?

我认为您需要设置轨迹栏的LargeChange属性,因为滚动事件被视为大更改,但LargeChange默认为0,因此,当您滚动时,该值仅增加/减少0,将其保留为0,只需添加一次标签即可。将创建和更改逻辑分为两种方法

Private prefix As String = "tb"
Private factor As Integer = 10

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    addLabels()
    changeLabels()
End Sub

Private Sub addLabels()
    For i = 0 To 10
        Dim tb As New Label()
        tb.Name = prefix & CStr(i)
        tb.Location = New Point(factor * i, factor * i * 2)
        Me.Panel1.Controls.Add(tb)
    Next
End Sub

Private Sub changeLabels()
    For i = 0 To 10
        Dim tb As Label = CType(Panel1.Controls(prefix & CStr(i)), Label)
        If Me.TrackBar1.Value = 1 Then tb.Text = "sometext"
        If Me.TrackBar1.Value = 0 Then tb.Text = "anothertext"
    Next
End Sub
现在,在TrackBar1\u滚动中,您只需更改它们(而不是重新创建它们)

由于标签值取决于轨迹栏值,因此没有理由在绘制中更新它们,这比轨迹栏更新更频繁


添加新标签和删除油漆中的旧标签似乎需要大量的额外处理。

您是否有意在每次表单喷漆时添加10个新标签?@puropoix 11 Labels;)@dunkleosteus这似乎是一种编写程序的疯狂方式。您为此解决方案选择了一个严重误导的体系结构。任何可能的修正案都不能合理地推断出你们正在进行的其他我们看不到的疯狂的事情。从我们可以看到,这个程序将继续消耗内存,直到系统耗尽并崩溃。这种方法完全是错误的——所有的一切都是错误的。用这种方法创建新标签,而不是仅仅更新你在设计器中添加的11个标签是非常昂贵的。你的应用现在很可能正在泄漏资源。绘制事件是数据跟踪的错误选择在绘制事件中唯一应该做的事情。正在绘制一些东西。谢谢,我现在使用了一个类似的结构,它似乎确实有效-仅使用System.drawing.Pen绘制线条似乎仅在绘制事件中有效。
Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    changeLabels()
End Sub