0

たとえば、次のコードのように、タイプを式として使用するトリックが存在するかどうか疑問に思っていました。

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

コントロール配列をどのように行うことができるかを尋ねているのではなく、たとえば var (ControlType) で Type を指定し、上記のコード例のように使用するなど、一般的なコントロール配列を行うことができるかどうかを尋ねています。

アップデート

これは今私が使用しようとしているコードです

ハンドラーをアタッチしようとすると、CheckBox の "CheckedChanged" イベントを認識できません。

また、値をチェックしようとすると、「.Checked」プロパティを認識できません。

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
4

2 に答える 2

1

更新された質問について: CheckBox 固有のプロパティまたはイベントを使用できるようにするには、オブジェクトを正しい型にキャストする必要があります。たとえば、代わりに

AddHandler ControlArray(num).CheckedChanged, AddressOf CheckBoxSub

あなたが書く

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

2番目の例でも同じです:

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

TryCastNothing指定されたオブジェクトを指定された型にキャストするか、オブジェクトの型が異なる場合は戻ります。

于 2013-06-11T11:12:29.750 に答える