将值从窗体传递到按钮文本 vb.net



我正在学习 vb.net,但在搜索所需内容时遇到问题。 我想创建一个在整个应用程序中"可重用"的按钮,而无需为每个实例编写代码。 所以,我想从形式中获取一个变量开始,例如公共整数值,当这个值发生变化时,我想写入按钮的文本。 我知道我可以通过以 btn_xxx.text = 变量的形式编写代码来轻松做到这一点,但是如果我有几个按钮并且每个按钮看起来相同的变量怎么办? 目前我所做的是创建一个继承按钮的组件,并有一个计时器,该计时器将在滴答声时查看变量并写入文本。 我相信有更好的方法。 谁能指出我正确的方向? 我知道我的部分问题是我不知道事物的名称命名法,所以希望我问我的问题不会有太多的困惑。

https://www.daniweb.com/programming/software-development/threads/124842/detect-variable-change,我看到了这个,但我看不出如何适应我的情况。

这是我所拥有的:

Private WithEvents Active_Alarm As New Nav_Active_Alarm

然后在计算计数的子内部:

Active_Alarm.Count = CInt(dt_Active_Alarms.Rows.Count)

用户控件:

Public Class Nav_Active_Alarm
Private mActive_Alarm_Count As Integer
Public Event Active_Alarm_Count_Changed(ByVal mvalue As Integer)
Public Property Count() As Integer
Get
Count = mActive_Alarm_Count
End Get
Set(ByVal value As Integer)
mActive_Alarm_Count = value
If Not Me.DesignMode Then
RaiseEvent Active_Alarm_Count_Changed(mActive_Alarm_Count)
test()
End If
End Set
End Property
Private Sub test()
If Not Me.DesignMode Then
If mActive_Alarm_Count = 0 Then
Me.btn_Goto_Active_Alarm.Image = My.Resources.Alarm_Clock_Static
'console or msgbox will work but updating the image will not
Else
Me.btn_Goto_Active_Alarm.Image = My.Resources.Alarm_Clock_Animation
'console or msgbox will work but updating the image will not
End If
End If
End Sub
End Class

如果我写信到控制台或添加消息框,我会看到事件正常工作。 但是,图像不会改变。 如果我从计时器调用测试子,它将起作用。 为什么按钮不会更新(顺便说一句,我确实尝试在代码中刷新和更新)?

观察者模式是您可能要寻找的。

这又快又脏。

创建一个类来保存变量值。添加将按钮实例添加到列表的方法。 然后,需要了解变量的按钮调用 register 方法。 当变量的值更改时,它将循环访问按钮列表并设置每个按钮的 Text 属性。

你可能在这里跳得太深太快了。.net 中的 Google 自定义数据绑定,您可以使用大量内置内容。虽然自己动手是一个很好的练习。

执行此操作的简单方法可能是:

  1. 创建表单级别列表以保存您感兴趣的按钮

  2. 将您感兴趣的按钮添加到列表中(可能在表单加载或其他有初始化代码的地方)

  3. 使用支持变量在窗体中创建一个私有属性,以保存要应用于按钮的值。在二传手部分旋转列表并设置每个按钮文本。


Dim lstButtons As New List(Of Button)
Sub SetupButtons()
'call from form load or other init code
lstButtons.Add(btnPopulate)
lstButtons.Add(btnPopulate)
End Sub

Private _buttonText As String
Private Property ButtonText As String
Get
Return _buttonText
End Get
Set(value As String)
_buttonText = value
For Each b As Button In lstButtons
b.Text = value
Next
End Set
End Property

当您设置属性(现在充当您的变量)时,它将为您更新所有文本框。

我知道你提到不必编写代码 - 但有些东西必须将事情联系在一起。 即使你使用了观察者模式(这是一个优雅的解决方案 - 所以对那些建议它的人来说),你最终可能会创建一个类来保存该属性,并让该类实现 INotifyPropertyChanged from System.ComponentModel,然后你还必须让每个按钮都有一个数据绑定,用于其文本属性到类对象中的属性。 实际上没有一种方法(我能想到)可以解决必须为您执行此操作的每个表单编写一些代码的问题(尽管您当然只需要编写一次类部分)。

最新更新