如何在运行时修改动态创建的 UserControl 对象
How to modify dynamically created UserControl objects at runtime
我已经制作了一个 UserControl(在 Plutonix 的帮助下),但是我在更改这些对象的状态时遇到了一些问题。
我用这段代码动态创建它们:
While UserData.Read
Dim CPID As String
Dim CPUN As String
CPID = UserData("Username").ToString
CPUN = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
Dim CP As New Contacts(CPID, CPUN)
CP.Name = CPID
CP.ContactName.Name = CPID
AddHandler CP.ContactName.Click, AddressOf Chatbox
If UserData("Status").ToString = "Online" Then
CP.Status = Contacts.ChatStatus.Online
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
ElseIf UserData("Status").ToString = "Afwezig" Then
CP.Status = Contacts.ChatStatus.Afwezig
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
ElseIf UserData("Status").ToString = "Offline" Then
CP.Status = Contacts.ChatStatus.Offline
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
Else
CP.Status = Contacts.ChatStatus.Onbekend
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
End If
CP.Dock = DockStyle.Top
ChatContactPanel.Controls.Add(CP)
End While
结果我得到这个:
现在我的问题是:
如何更改每个用户的联系人对象的 MsgStatus 和 Status
假设您要查找 "Patricia":
Dim user = "Patricia"
Dim chatter = ChatContactPanel.Controls.
OfType(Of Contacts).
FirstOrDefault(Function(c) c.ChatName.StartsWith(user))
If chatter IsNot Nothing Then
chatter.Status = chatter.ChatStatus.Online
End If
我猜"Contacts"是用户控件名,"ChatContactPanel"是存放它们的容器控件。 对此信息进行了编辑。
- 最好通过 Id 找到它们,因为名称很少是唯一的
- 如果让
ChatUser
class 来管理它,而不是每次发生变化时都找到它们,那就更好了。
您的应用肯定还有其他用户跟踪的运行时数据。在 ChatUser
class 中的 ChatControl
属性 将阻止您完全搜索它们并允许 class 管理它:
myChatBox.Status = myStatus
class 也可以使用已设置的属性为您创建控件。
我知道这不是您问题的答案 - 这只是一个有用的指示 - 如果您希望我删除它,请随时告诉我 - 如果我遗漏了什么,我深表歉意,如果我的代码中有拼写错误,但是您的 If..End If
语句的大块包含很多重复的代码。可以这样改写 -
Select Case Userdata("Status").ToString
Case "Online"
CP.Status = Contacts.ChatStatus.Online
Case "Afwezig"
CP.Status = Contacts.ChatStatus.Afwezig
Case "Offline"
CP.Status = Contacts.ChatStatus.Offline
else
CP.Status = Contacts.ChatStatus.OnBekend
End Select
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
如果代码完全错误,我也深表歉意,但我无法对其进行测试。
我已经制作了一个 UserControl(在 Plutonix 的帮助下),但是我在更改这些对象的状态时遇到了一些问题。
我用这段代码动态创建它们:
While UserData.Read
Dim CPID As String
Dim CPUN As String
CPID = UserData("Username").ToString
CPUN = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
Dim CP As New Contacts(CPID, CPUN)
CP.Name = CPID
CP.ContactName.Name = CPID
AddHandler CP.ContactName.Click, AddressOf Chatbox
If UserData("Status").ToString = "Online" Then
CP.Status = Contacts.ChatStatus.Online
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
ElseIf UserData("Status").ToString = "Afwezig" Then
CP.Status = Contacts.ChatStatus.Afwezig
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
ElseIf UserData("Status").ToString = "Offline" Then
CP.Status = Contacts.ChatStatus.Offline
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
Else
CP.Status = Contacts.ChatStatus.Onbekend
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
End If
CP.Dock = DockStyle.Top
ChatContactPanel.Controls.Add(CP)
End While
结果我得到这个:
现在我的问题是: 如何更改每个用户的联系人对象的 MsgStatus 和 Status
假设您要查找 "Patricia":
Dim user = "Patricia"
Dim chatter = ChatContactPanel.Controls.
OfType(Of Contacts).
FirstOrDefault(Function(c) c.ChatName.StartsWith(user))
If chatter IsNot Nothing Then
chatter.Status = chatter.ChatStatus.Online
End If
我猜"Contacts"是用户控件名,"ChatContactPanel"是存放它们的容器控件。
- 最好通过 Id 找到它们,因为名称很少是唯一的
- 如果让
ChatUser
class 来管理它,而不是每次发生变化时都找到它们,那就更好了。
您的应用肯定还有其他用户跟踪的运行时数据。在 ChatUser
class 中的 ChatControl
属性 将阻止您完全搜索它们并允许 class 管理它:
myChatBox.Status = myStatus
class 也可以使用已设置的属性为您创建控件。
我知道这不是您问题的答案 - 这只是一个有用的指示 - 如果您希望我删除它,请随时告诉我 - 如果我遗漏了什么,我深表歉意,如果我的代码中有拼写错误,但是您的 If..End If
语句的大块包含很多重复的代码。可以这样改写 -
Select Case Userdata("Status").ToString
Case "Online"
CP.Status = Contacts.ChatStatus.Online
Case "Afwezig"
CP.Status = Contacts.ChatStatus.Afwezig
Case "Offline"
CP.Status = Contacts.ChatStatus.Offline
else
CP.Status = Contacts.ChatStatus.OnBekend
End Select
If UserData("NieuwBericht").ToString = "Ja" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Ja
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
CP.MsgStatus = Contacts.ChatMsgStatus.Nee
Else
CP.MsgStatus = Contacts.ChatMsgStatus.Onbekend
End If
如果代码完全错误,我也深表歉意,但我无法对其进行测试。