2

文字列をオブジェクト名として使用しようとしています。例 オブジェクトがあり、名前は Label1 です。これはできますか?

Dim i As String = "Label1"
someVariable = i.Text

オブジェクト名として文字列を使用していますが、可能ですか?

4

5 に答える 5

3

@Christian Sauerが言ったように、すべてのコントロールを反復処理できますが、コントロールがコントロールのコンテナーである場合、問題が発生する可能性があります。それを解決するには、再帰的な検索を行う必要があります。ただし、ControlCollection実際にFind()使用できる方法があります。名前に一致するコントロールの配列を返し、オプションで再帰検索を実行します。

    ''//Our final control
    Dim someVariable As Control = Nothing
    ''//Search recursively for our control
    Dim SearchedControls = Me.Controls.Find(key:="Label1", searchAllChildren:=True)
    ''//If we found one and only one control
    If SearchedControls.Count = 1 Then
        ''//Set it to our variable
        someVariable = SearchedControls(0)
    Else
        ''//Whatever your logic dictates here
    End If
于 2013-03-11T13:41:29.633 に答える
2

これは不可能ですが、できることは次のとおりです。

Dim i As String = "Label1"

Dim Obj  as Label
for each elem in me.controls
   if elem.Name = i then
     Obj =  elem
     exit for
   end if
next

someVariable = obj.Text

すべての WinForms コントロールを繰り返し処理して、「Label1」という名前のラベルを見つけます。見つかったら、ラベルを変数に割り当てます。これは機能しますが、特にコントロールを追加する場合は非常に危険です

于 2013-03-11T13:16:55.260 に答える
1

答えられたことは知っていますが、これは私の図書館からのものであり、私はいつもそれを使用しています。@ChrisHaasが提案したように、すべてのコントロールとコンテナのコントロールを再帰的に繰り返します。

Public Function GetControlByName(ByRef parent As Control, ByVal name As String) As Control
    For Each c As Control In parent.ChildControls
        If c.Name = name Then
            Return c
        End If
    Next
    Return Nothing
End Function

<Extension()> _
Public Function ChildControls(ByVal parent As Control) As ArrayList
    Return ChildControls(Of Control)(parent)
End Function

<Extension()> _
Public Function ChildControls(Of T)(ByVal parent As Control) As ArrayList
    Dim result As New ArrayList()
    For Each ctrl As Control In parent.Controls
        If TypeOf ctrl Is T Then result.Add(ctrl)
        result.AddRange(ChildControls(Of T)(ctrl))
    Next
    Return result
End Function

(以前に質問され、回答されました) Webユーザーコントロールのコントロールをループスルーします

于 2013-03-11T15:18:11.663 に答える
0

私はそれが答えられたと確信していますが、それが修正されたことを確認するために、それが制御配列と結果であることを明確にするためのいくつかの点があります。

Private Sub btn1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
    Dim Ds As New DataSet

    Dim str As String = ""
    str = " SELECT     TOP (10) t_Suppliers.STNo  from t_Suppliers  "
     Ds = SqlHelper.ExecuteDataset(ConnectionString, CommandType.Text, str)
    For i As Integer = 0 To Ds.Tables(0).Rows.Count - 1
        Dim str1 As String = "lblInv" & i + 1
        Dim OBj As New Label
        Try

       Dim SearchedControls() As Control = Me.Controls.Find(key:=str1, searchAllChildren:=True)
           If SearchedControls.Length > 0 Then
                SearchedControls(0).Text = Ds.Tables(0).Rows(i).Item("STNo").ToString
            End If
        Catch
        End Try
    Next
End Sub
于 2015-02-27T00:35:09.877 に答える