none
Zusammensetzen von Objektnamen (RadioButton) RRS feed

  • Frage

  • Hi zusammen,

    mal wieder eine wahrscheinlich leichte, jedoch für mich gerade unlösbare Frage:

    Situation: Ich habe ein Formular mit vielen RadioButtons. Die haben den Namen w11 bis w99

    um nicht sämtliche 88 Radiobuttons einzeln ansprechen zu müssen möchte ich das mit einer FOR schleife lösen. Allerdings möchte ich NICHT nach FOR EACH fragen sondern bewusst nach den beiden Ziffern in dem Namen da diese wichtige Koordinaten geben.

    In VBA in Excel mache ich sowas normalerweise recht einfach über

    If form.controls("w" & cstr(Ziffer1) & cstr(Ziffer2)) =  true then....

    Dummerweise scheint das in Visual Studio so nicht zu funktionieren oder habe ich da einen Fehler drin? Hier ist der code:

            For i = 1 To 10
                If frmBeoBogen1.Controls("w1" & CStr(i - 1)).checked = True Then
                    Call x("L14:L17")
                End If
            Next

    Ich habe das hier mal sehr vereinfacht von w10 bis w19 dargestellt (w10 existiert auch). Die Fehlermeldung ist dann:

    Fehler 4 "checked" ist kein Member von "System.Windows.Forms.Control". 

    Wo ist nur mein Fehler?

    Vielen Dank im Voraus für eure Antwort

    Grüße

    Idhaun


    • Bearbeitet Idhaun Samstag, 4. Oktober 2014 20:54 Nicht das jemand sagt w10 gibts nicht ;-)
    Samstag, 4. Oktober 2014 20:52

Antworten

  • Hallo,
    um auf die Controls einer anderen Form zuzugreifen, musst du entsprechend auf die Instanz der 2. Form zugreifen und deren Controls-Auflistung verarbeiten. Also wie in deiner 2. If-Abfrage.
    Der Fehler deutet darauf hin, das irgend etwas in deinem Code nicht zugewiesen ist. Vielleicht die Instnz der anderen Form oder aber es gibt keinen RadioButtoin mit entsprechenden Namen.

    Einfach auf eine andere Form zuzugreifen ist im Allgemeinen aber ein schlechter Stil. Besser wäre es in der einen Form ein Event auszulösen, welchen die andere Form dann abonniert und daraufhin die Controls verarbeitet. Unter Ereignisse (Visual Basic) findest du eine Erklärung wie das geht.

    Ich benutze lieber CStr() damit ich darin rechnen kann.

    Wenn du den eigentlichen Ausdruck einklammerst, kannst du auch mit ToString rechnen:

    Dim drei As String = (1+2).ToString()
    Ob CStr oder ToString spielt aber keine Rolle.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Idhaun Sonntag, 5. Oktober 2014 13:19
    Sonntag, 5. Oktober 2014 11:48
    Moderator

Alle Antworten

  • Hallo,
    die Controls-Auflistung gibt dir ein allgemeines Control zurück, dieses musst du erst casten, bevor du auch Eigenschaften anderer Controls abfragen kannst:
    For i = 1 To 10
      If CType(Controls("w1" & i.ToString()), RadioButton).Checked Then
    'Mache was...' End If Next
    Im Grunde ist es hier wie in deinem VBA-Code, nur das .NET Typsicher ist. Das heißt, das der Compiler einen Fehler wirft, wenn du nicht explizit sagst das das Control ein RadioButton ist.

    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Samstag, 4. Oktober 2014 21:02
    Moderator
  • Am 04.10.2014 schrieb Koopakiller [MVP]:

    For i = 1 To 10
        If CType(Controls("w1" & i.ToString()), RadioButton).Checked Then
            'Mache was...'
        End If
    Next

    Im Grunde ist es hier wie in deinem VBA-Code, nur das .NET Typsicher ist. Das heißt, das der Compiler einen Fehler wirft, wenn du nicht explizit sagst das das Control ein RadioButton ist.

    Täusche ich mich, oder hätte ein Option Explicit On hier einen
    passenden Vorschlag gebracht?


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Samstag, 4. Oktober 2014 21:45
  • Hallo Winfried,

    das dürfte in diesem speziellen Fall keinen Unterschied machen. Die Fehlermeldung bleibt die selbe und auch unter Option Strict Off würde der Code nicht kompilieren (gleicher Fehler).

    Allgemein ist Option Strict On aber empfehlenswert, da man so noch mehr Fehler finden kann.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Sonntag, 5. Oktober 2014 00:29
    Moderator
  • Am 05.10.2014 schrieb Koopakiller [MVP]:

    das dürfte in diesem speziellen Fall keinen Unterschied machen. Die Fehlermeldung bleibt die selbe und auch unter/Option Strict Off/ würde der Code nicht kompilieren (gleicher Fehler).

    Aber IMHO bekommt man die passenden Vorschläge zur Korrektur, sorry,
    das meinte ich eigentlich. Danke für die Korrektur.

    Allgemein ist /Option Strict On/ aber empfehlenswert, da man so noch mehr Fehler finden kann.

    Stimmt, ein paar alte Projekte umgestellt und schon war Nacharbeit
    angesagt. ;)


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Sonntag, 5. Oktober 2014 09:02
  • Vielen Dank für eure Antwort.

    Sieht auch ganz gut aus. Nur eine kleine Ausnahme bekomme ich noch. Und zwar befinden sich die RadioButtons auf einer anderen UserForm. Somit muss ich diese ja auch noch ansprechen. Nur in welchem Teil der Codezeile packe ich das rein?

    Folgendes habe ich schon probiert:

    If CType(Controls("frmBeoBogen.w1" & CStr(i - 1)), RadioButton).Checked = True Then

    If CType(frmBeoBogen.Controls("w1" & CStr(i - 1)), RadioButton).Checked = True Then

    Als Ausnahme bekomme ich dann:

    "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Ich forsche weiter und hoffe selber auf die Antwort zu kommen wenn ihr die Antwort aber schon mal vervollständigen könnt wäre das auch sehr nett.

    Ich benutze lieber CStr() damit ich darin rechnen kann.

    Viele Grüße und vielen Dank

    Idhaun 


    • Bearbeitet Idhaun Sonntag, 5. Oktober 2014 10:21 Ausnahmetext hinzugefügt
    Sonntag, 5. Oktober 2014 10:20
  • Hallo,
    um auf die Controls einer anderen Form zuzugreifen, musst du entsprechend auf die Instanz der 2. Form zugreifen und deren Controls-Auflistung verarbeiten. Also wie in deiner 2. If-Abfrage.
    Der Fehler deutet darauf hin, das irgend etwas in deinem Code nicht zugewiesen ist. Vielleicht die Instnz der anderen Form oder aber es gibt keinen RadioButtoin mit entsprechenden Namen.

    Einfach auf eine andere Form zuzugreifen ist im Allgemeinen aber ein schlechter Stil. Besser wäre es in der einen Form ein Event auszulösen, welchen die andere Form dann abonniert und daraufhin die Controls verarbeitet. Unter Ereignisse (Visual Basic) findest du eine Erklärung wie das geht.

    Ich benutze lieber CStr() damit ich darin rechnen kann.

    Wenn du den eigentlichen Ausdruck einklammerst, kannst du auch mit ToString rechnen:

    Dim drei As String = (1+2).ToString()
    Ob CStr oder ToString spielt aber keine Rolle.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Idhaun Sonntag, 5. Oktober 2014 13:19
    Sonntag, 5. Oktober 2014 11:48
    Moderator
  • Hi Koopakiller,

    vielen Dank für deine Antwort. Das mit den Events werde ich mal genauer studieren.

    Gruß

    Idhaun

    Sonntag, 5. Oktober 2014 13:19
  • Hallo,

    nur als Ergänzung. Man kann hier (manche missen das aus alten VB6 Zeiten) auch mit Control Arrays arbeiten. Ist Geschmackssache aber es geht wenn man die Controls manuell, also nicht über den Designer hinzufügt.

    Private rbtn(9) As RadioButton
    
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
        For i As Integer = 0 To 9
            rbtn(i) = New RadioButton
    
            rbtn(i).Location = New Point(10, i * 20)
            rbtn(i).Text = "RadioButton " & i
            Me.Controls.Add(rbtn(i))
    
       Next
    
    
    
    End Sub

    For i = 0 To 9
        If rbtn(i).Checked = True Then
          MessageBox.Show("RadioButton " & i & " is checked")
        End If
    Next

    Gruß


    Jens Gerber

    Sonntag, 5. Oktober 2014 18:48