Benutzer mit den meisten Antworten
Zusammensetzen von Objektnamen (RadioButton)

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 ;-)
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
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
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.
'Mache was...' End If NextTom 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 -
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 -
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 -
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 -
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
-
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
-
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