2013-06-11 3 views
0

Je me demandais si existe une astuce pour utiliser un type comme une expression, par exemple dans ce code:Comment utiliser un type comme expression?

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

    Dim ControlType = CheckBox ' CheckBox is a type and cannot be used as an expression 

    Dim ControlArray(5) As ControlType ' (5) The number of controls to create. 

    For num As Int64 = 0 To ControlArray.LongLength - 1 
     ControlArray(num) = New ControlType ' Expected: New CheckBox 
     ControlArray(num).Text = (ControlType.ToString & num.ToString) ' Expected string: "CheckBox 0" 
     Me.Controls.Add(ControlArray(num)) 
    Next 

End Sub 

Je ne demande pas comment je peux faire un tableau de contrôle, je demande si je peux faire un tableau de contrôle générique par exemple en spécifiant le Type dans un var (ControlType) et en l'utilisant comme dans l'exemple de code ci-dessus.

MISE À JOUR

C'est maintenant le code que je suis en train d'utiliser

Je ne peux pas reconnaître l'événement « CheckedChanged » du CheckBox en essayant de joindre le gestionnaire

Également ne peut pas reconnaître la propriété ".Checked" lorsque vous essayez de vérifier la valeur de celui-ci.

Public Class Form1 

    Dim ControlType As Type = GetType(CheckBox) ' The type of Control to create. 
    Dim ControlArray(5) As Control    ' (5) The number of controls to create. 

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

     For num As Int64 = 0 To ControlArray.LongLength - 1 
      ControlArray(num) = Activator.CreateInstance(ControlType) ' Create the control instance (New CheckBox) 
      ControlArray(num).Name = ControlType.Name & num.ToString ' Name example : CheckBox 0 
      ControlArray(num).Text = ControlType.Name & num.ToString ' String example: CheckBox 0 
      ControlArray(num).Top = 20 * num ' Adjust the location of each control. 
      Me.Controls.Add(ControlArray(num)) ' Add the control to a container. 

      ' This does not work: 
      AddHandler ControlArray(num).CheckedChanged, AddressOf CheckBoxSub ' Add a event handler to a procedure. 

     Next 

    End Sub 

    Public Sub CheckBoxSub(ByVal sender As Object, ByVal e As System.EventArgs) ' Sub which is handling the controls. 

     If sender.Checked = True Then MsgBox(sender.name & " is checked") Else MsgBox(sender.name & " is unchecked") 

     ' Just an example of how to use the controls, 
     ' This does not work: 
     ControlArray(2).checked = True ' CheckBox 2.Checked = True 

    End Sub 

End Class 

Répondre

1

Vous pouvez utiliser System.Type pour contenir le type d'un objet.

Vous pouvez également utiliser Activator.CreateInstance (MyType) pour créer une instance de l'objet de type MyType.

par exemple.

Dim ControlType As System.Type = GetType(CheckBox) 
Dim ControlArray(5) As Control 

For num As Int64 = 0 To 5 
    ControlArray(num) = Activator.CreateInstance(ControlType) 
    ControlArray(num).Left = num * 100 
    ControlArray(num).Name = "CheckBox " & num 
    ControlArray(num).Text = ControlArray(num).Name 
    Me.Controls.Add(ControlArray(num)) 
Next 

EDIT:

Pour ajouter un gestionnaire d'événements, vous devez DirectCast() le contrôle du type d'objet, par exemple:

AddHandler DirectCast(ControlArray(Num), CheckBox).CheckedChanged, AddressOf MyHandler 
+0

Merci beaucoup, mais j'ai des problèmes pour ajouter un gestionnaire en utilisant votre modification, pouvez-vous voir ma question mise à jour s'il vous plaît? – ElektroStudios

1

A propos de votre question mise à jour: Vous devez cast l'objet au type correct pour pouvoir utiliser des propriétés ou des événements spécifiques à CheckBox. Par exemple. au lieu de

AddHandler ControlArray(num).CheckedChanged, AddressOf CheckBoxSub 

vous écrivez

Dim cbx As CheckBox = TryCast(ControlArray(num), CheckBox) 
If cbx IsNot Nothing Then 
    AddHandler cbx.CheckedChanged, AddressOf CheckBoxSub 
End If 

même pour votre deuxième exemple:

Dim cbx As CheckBox = TryCast(ControlArray(2), CheckBox) 
If cbx IsNot Nothing Then   ' If the second control is a check box 
    cbx.Checked = True 
End If 

TryCast jette l'objet donné au type donné ou retourne Nothing si l'objet a un type différent .

+0

Merci pour votre réponse – ElektroStudios

Questions connexes