2

ComboBoxのグループを反復処理し、連結された文字列と変数を使用してプロパティを設定し、コントロールの名前を表現しようとしています。ただし、フォームのインスタンスに(String&Integer_Variable)をコントロールの1つとして認識させることができないため、適切なプロパティまたはサブルーチンをSystem.Windows.Formsのメンバーとして認識しません。 。コントロール。

私はSOでDirectCastソリューションを見つけ、それは機能しているように見えますが(私は疑わしいですが)、それは非常に不器用なソリューションのように感じます。これを行うためのよりクリーンな方法はありますか?

For myTempCount = 1 To 6
    If tempValue < Me.("ComboBox" & myTempCount).Items.Count Then
        ComboBox.SelectedIndex = tempValue 'appears to work -- how?
        Me.ComboBox.SelectedIndex = tempValue 'appears to work

        Me.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work
        Me.Controls.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work

        DirectCast(Me.Controls.Find(("ComboBox" & myTempCount), True)(0), ComboBox).SelectedIndex = tempValue 'appears to work
        DirectCast(Me.Controls("ComboBox" & myTempCount), ComboBox).SelectedIndex = tempValue  'appears to work
Next

このコードは元々VBA/VB6でしたが、ArtinSoftのVisual Basic Upgrade Companion(VBUC)を使用しました。FWIW、私はMicrosoft Visual Basic2010Expressを使用しています。

4

6 に答える 6

3

あなたの質問に答えるには:

  1. ComboBox1.SelectedIndexComboBox1は、フォームのControlCollectionに存在するコントロールであるため機能します
  2. Me.ComboBoxPrinter1.SelectedIndexMeはフォームクラスへの参照であり、コントロールを参照しているため、機能します。
  3. Me.("ComboBoxPrinter" & myTempCount).SelectedIndexComboBoxPrinter & myTempCount文字列はコントロールではなく文字列であるため、機能しません。
  4. Me.Controls.("ComboBoxPrinter" & myTempCount).SelectedIndex同じ理由で機能しません。
  5. 他の2つのインスタンスは、文字列をキーとして使用して、キャストしたコントロールをルックアップして適切なタイプに返し、プロパティを設定しているために機能します。

私は通常、DirectCast以外のCTypeを使用しています。CTypeとDirectCastのこのリンクによる主な違いは、DirectCastは正確なタイプである必要があるのに対し、CTypeはコンバージョンの縮小または拡大に使用できることです。DirectCastは、より厄介ですが、より効率的です。

そうは言っても、あなたはこのようなことをすることができます:

For myTempCount = 1 To 6
    If Controls.ContainsKey("ComboBox" & myTempCount) Then
        CType(Controls("ComboBox" & myTempCount), ComboBox).SelectedIndex = tempValue
    End If
Next

同じコレクションを参照しているため、コントロールの前でMeを使用していません。コントロールが別のコレクションにある場合は、代わりにそのコンテナを使用する必要があります。つまり、パネルを使用していた場合Panel1.Controls.ContainsKey

于 2012-05-23T01:46:08.933 に答える
0

たぶんあなたはこのようなことを試すことができます(C#):

List<Control> comboBoxes = new List<Control>
{
   ComboBoxPrinter1,
   ComboBoxPrinter2,
   ComboBoxPrinter3,
   ComboBoxPrinter4,
   ComboBoxPrinter5,
   ComboBoxPrinter6
};

// loop through combo boxes collection by position
for (int = 0; i < comboBoxes.Length;i++)
{
    // put in your if logic here, and refer to current combo box using comboBoxes[i]
}

オンラインツールを使用してVB.NETに変換された上記のコードは次のとおりです。

Dim comboBoxes As New List(Of Control)()From {_
    ComboBoxPrinter1、_
    ComboBoxPrinter2、_
    ComboBoxPrinter3、_
    ComboBoxPrinter4、_
    ComboBoxPrinter5、_
    ComboBoxPrinter6 _
}

For i As Integer = 0 To comboBoxes.Count-1
  // ifロジックをフックし、comboBoxes[i]を使用して各コンボボックスを参照できます。
次

これがお役に立てば幸いです。

于 2012-05-23T01:22:08.853 に答える
0

痛い!!! ダイレクトキャストを一度いじりました。悪夢だったのを覚えています。私の好みは、サーバー側のコントロールに固執するか、クライアント側のJavascript/Ajaxとして書き込むことです。上記のコードのどこで失敗していますか?内部の例外はありますか?

于 2012-05-23T00:22:20.863 に答える
0

共通のプロパティ(など)で同じ操作を実行する必要がある、さまざまなタイプの複数のコントロールでこの問題に再び遭遇しました.Text。のコントロールタイプパラメータを表すために変数を使用することはできないため、コントロールを取得CType()するには、条件付きの対応するハードコードされCType()たコマンドを使用する必要があります。これは私が思いついたものです:

Function getControl(ByVal controlName As String) As Control
    numCtrls = FrameMain.Controls.Count()
    For I As Integer = 0 To numCtrls - 1
        If FrameMain.Controls.Item(I).Name = controlName Then
            If TypeOf FrameMain.Controls.Item(I) Is ComboBox Then
                Return CType(FrameMain.Controls(controlName), ComboBox)
            End If
        End If
    Next
End Function

controlName連結された文字列名です。したがって、この関数は、前の回答で使用したのとほぼ同じように使用できますCType()

getControl("TextBox" & myTempCount).Text = "whatever"
于 2012-07-05T04:23:42.940 に答える
0

このようなもの:

Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    Dim control As Control = Me.Controls("Button1")
    Select Case control.GetType
        Case GetType(Button)
            Dim btn As Button = DirectCast(control, Button)
            With btn
                .Text = "hi"
            End With
        Case GetType(Label)
            Dim lbl As Label = DirectCast(control, Label)
            With lbl
                .Text = "hi"
            End With
        Case Else 'etc
    End Select
End Sub
于 2014-10-26T09:12:23.030 に答える
0

Sub Button2Click(sender As Object、e As EventArgs)'For i = 1 To 5 If textBox15_08_St.Text = "" Then MessageBox.Show( "Bitte die Anzahl eintragen!"、 "Info"、MessageBoxButtons.OK、MessageBoxIcon.Information)サブエンドを
終了する場合

If dataGridView15_08.SelectedRows.Count = 0 And dataGridView15_08.SelectedCells.Count = 0 Then
    MessageBox.Show("Bitte eine Zeile auswählen","Info",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Exit Sub    
End If

If dataGridView15_08.SelectedRows.Count > 1 Then
    MessageBox.Show("Bitte nur 1 Zeile auswählen!","Info",MessageBoxButtons.OK,MessageBoxIcon.Exclamation)
    Exit Sub    
End If  

If dataGridView15_08.Rows.Count = 0 Then
    MessageBox.Show("Bitte Filter überprüfen!","Info",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Exit Sub    
End If

Dim i As Integer = 1

各cについてpanelCheckBox.Controlsのチェックボックスとして

Dim BoxName As String = "checkBox15_08_"&Str(i)Dim CheckName As String = "checkBox15_08_"&Str(i)

BoxName = BoxName.Replace( ""、 "")

If c.Name = BoxName Then

    If c.Checked = False Then
        
        c.Checked = True



    CType(Me.panelCheckBox.Controls(CheckName.Replace(" ","")), CheckBox).Enabled = True
    CType(Me.panelTextbox.Controls(BoxName.Replace("checkBox15_08","Hersteller15")), TextBox).Text = Convert.ToString(dataGridView15_08.Rows(dataGridView15_08.CurrentRow.Index).Cells(1).Value)
    CType(Me.panelTextbox.Controls(BoxName.Replace("checkBox15_08","Artikel15")), TextBox).Text = Convert.ToString(dataGridView15_08.Rows(dataGridView15_08.CurrentRow.Index).Cells(3).Value)
    CType(Me.panelTextbox.Controls(BoxName.Replace("checkBox15_08","Artikel_St_15")), TextBox).Text = Me.textBox15_08_St.Text
    textBox15_08_St.Text = ""
    Exit For
    Else
        If CType(Me.panelTextbox.Controls(BoxName.Replace("checkBox15_08","Hersteller15")), TextBox).Text = Convert.ToString(dataGridView15_08.Rows(dataGridView15_08.CurrentRow.Index).Cells(1).Value) _
            And CType(Me.panelTextbox.Controls(BoxName.Replace("checkBox15_08","Artikel15")), TextBox).Text = Convert.ToString(dataGridView15_08.Rows(dataGridView15_08.CurrentRow.Index).Cells(3).Value) Then
            
            MessageBox.Show("Dieser Artikel wurde bereits hinzugefügt","Info",MessageBoxButtons.OK,MessageBoxIcon.Information)
            Exit For    
            
        End If
    End If
End If
i = i+1
If i = 31 Then
    MessageBox.Show("Die maximale Anzahl wurde erreicht" & vbCrLf & "Bitte setze Dich mit dem Programierer in Verbindung" & vbCrLf & "Um ein Update Erweiterung zu planen","Info",MessageBoxButtons.OK,MessageBoxIcon.Error)
    Exit For    
End If  

'End For End Sub

Sub checkBox15_08_1Click(sender As Object、e As EventArgs)Handles checkBox15_08_1.Click checkBox15_08_1.Checked = Me.getControl(1)End Sub

Sub checkBox15_08_2Click(sender As Object、e As EventArgs)Handles checkBox15_08_2.Click checkBox15_08_2.Checked = Me.getControl(2)End Sub

Sub checkBox15_08_3Click(sender As Object、e As EventArgs)Handles checkBox15_08_3.Click checkBox15_08_3.Checked = Me.getControl(3)End Sub

Sub checkBox15_08_4Click(sender As Object、e As EventArgs)Handles checkBox15_08_4.Click checkBox15_08_4.Checked = Me.getControl(4)End Sub

Sub checkBox15_08_5Click(sender As Object、e As EventArgs)Handles checkBox15_08_5.Click checkBox15_08_5.Checked = Me.getControl(5)End Sub

Sub checkBox15_08_6Click(sender As Object、e As EventArgs)Handles checkBox15_08_6.Click checkBox15_08_6.Checked = Me.getControl(6)End Sub

Sub checkBox15_08_7Click(sender As Object、e As EventArgs)Handles checkBox15_08_7.Click checkBox15_08_7.Checked = Me.getControl(7)End Sub

Sub checkBox15_08_8Click(sender As Object、e As EventArgs)Handles checkBox15_08_8.Click checkBox15_08_8.Checked = Me.getControl(8)End Sub

Sub checkBox15_08_9Click(sender As Object、e As EventArgs)Handles checkBox15_08_9.Click checkBox15_08_9.Checked = Me.getControl(9)End Sub

Sub checkBox15_08_10Click(sender As Object、e As EventArgs)Handles checkBox15_08_10.Click checkBox15_08_10.Checked = Me.getControl(10)End Sub

Sub checkBox15_08_11Click(sender As Object、e As EventArgs)Handles checkBox15_08_11.Click checkBox15_08_11.Checked = Me.getControl(11)End Sub

Sub checkBox15_08_12Click(sender As Object、e As EventArgs)Handles checkBox15_08_12.Click checkBox15_08_12.Checked = Me.getControl(12)End Sub

Sub checkBox15_08_13Click(sender As Object、e As EventArgs)Handles checkBox15_08_13.Click checkBox15_08_13.Checked = Me.getControl(13)End Sub

Sub checkBox15_08_14Click(sender As Object、e As EventArgs)Handles checkBox15_08_14.Click checkBox15_08_14.Checked = Me.getControl(14)End Sub

Sub checkBox15_08_15Click(sender As Object、e As EventArgs)Handles checkBox15_08_15.Click checkBox15_08_15.Checked = Me.getControl(15)End Sub

Sub checkBox15_08_16Click(sender As Object、e As EventArgs)Handles checkBox15_08_16.Click checkBox15_08_16.Checked = Me.getControl(16)End Sub

Sub checkBox15_08_17Click(sender As Object、e As EventArgs)Handles checkBox15_08_17.Click checkBox15_08_17.Checked = Me.getControl(17)End Sub

Sub checkBox15_08_18Click(sender As Object、e As EventArgs)Handles checkBox15_08_18.Click checkBox15_08_18.Checked = Me.getControl(18)End Sub

Sub checkBox15_08_19Click(sender As Object、e As EventArgs)Handles checkBox15_08_19.Click checkBox15_08_19.Checked = Me.getControl(19)End Sub

Sub checkBox15_08_20Click(sender As Object、e As EventArgs)Handles checkBox15_08_20.Click checkBox15_08_20.Checked = Me.getControl(20)End Sub

Sub checkBox15_08_21Click(sender As Object、e As EventArgs)Handles checkBox15_08_21.Click checkBox15_08_21.Checked = Me.getControl(21)End Sub

Sub checkBox15_08_22Click(sender As Object、e As EventArgs)Handles checkBox15_08_22.Click checkBox15_08_22.Checked = Me.getControl(22)End Sub

Sub checkBox15_08_23Click(sender As Object、e As EventArgs)Handles checkBox15_08_23.Click checkBox15_08_23.Checked = Me.getControl(23)End Sub Sub checkBox15_08_24Click(sender As Object、e As EventArgs)Handles checkBox15_08_24.Click checkBox15_08_24.Checked = Me 24)エンドサブ

Sub checkBox15_08_25Click(sender As Object、e As EventArgs)Handles checkBox15_08_25.Click checkBox15_08_25.Checked = Me.getControl(24)End Sub

Sub checkBox15_08_26Click(sender As Object、e As EventArgs)Handles checkBox15_08_26.Click checkBox15_08_26.Checked = Me.getControl(26)End Sub Sub checkBox15_08_27Click(sender As Object、e As EventArgs)Handles checkBox15_08_27.Click checkBox15_08_27.Checked = Me 27)エンドサブ

Sub checkBox15_08_28Click(sender As Object、e As EventArgs)Handles checkBox15_08_28.Click checkBox15_08_28.Checked = Me.getControl(28)End Sub

Sub checkBox15_08_29Click(sender As Object、e As EventArgs)Handles checkBox15_08_29.Click checkBox15_08_29.Checked = Me.getControl(29)End Sub

Sub checkBox15_08_30Click(sender As Object、e As EventArgs)Handles checkBox15_08_30.Click checkBox15_08_30.Checked = Me.getControl(30)End Sub

関数getControl(ByVal controlName As Integer)As Boolean

Dim txt_Name1 As String = "Hersteller15_" & Str(controlName)
Dim txt_Name2 As String = "Artikel15_" & Str(controlName)
Dim txt_Name3 As String = "Artikel_St_15_" & Str(controlName)
Dim CheckName As String = "checkBox15_08_" & Str(controlName)

CType(Me.panelCheckBox.Controls(CheckName.Replace( ""、 ""))、CheckBox).Enabled =TrueThenの場合

CType(Me.panelCheckBox.Controls(CheckName.Replace(" ","")), CheckBox).Enabled = False
MessageBox.Show(txt_Name1)
    
CType(Me.panelTextbox.Controls(txt_Name1.Replace(" ", "")), TextBox).Text = ""
CType(Me.panelTextbox.Controls(txt_Name2.Replace(" ", "")), TextBox).Text = ""
CType(Me.panelTextbox.Controls(txt_Name3.Replace(" ", "")), TextBox).Text = ""

End If

Falseを返す

終了機能

'コマンドReplace( ""、 ""))がないと機能しません'調整する必要があります!'Me.Controls(txt_Name1.Replace( ""、 ""))、TextBox).Text = "whatever"' Me.panelCheckBox.Controls(txt_Name1.Replace( ""、 ""))、TextBox).Text = "何でも"'Me.GroupBox1.Controls(txt_Name1.Replace(" "、" "))、TextBox).Text="何でも"

于 2021-06-13T17:50:50.923 に答える