如何在运行时修改动态创建的 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

如果代码完全错误,我也深表歉意,但我无法对其进行测试。