vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 08:49

Hallo zusammen,

ich tue mich nochh immer ein bisschen schwer mit dem Umstieg auf VB.Net.

Eine Funktion die ich schmerzlich vermisse ist das Indizieren von Objekt (so heißt es glaube ich).

Gemeint ist die Funktion unter VB4-5-6, wo ich jedem Objekt (z.B. Button) einen Index zuordnen konnte. Wenn ich dann Eigenschaften der Buttons ändern will, kann ich das ganz einfach auf diese Art und Weise:

For I = 1 to 10
Button1(I).Visible = True
Next I

Wie kann ich das jetzt unter VB.Net realisieren. Es kann doch nicht sein, das ich da jetzt
10 Zeilen für benötige oder??? Die Eigenschaft Index gibt es ja nicht mehr... oder heißt die jetzt anders???

Für eure Hilfe wäre ich sehr dankbar.

Gruß
Tommi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 09:06

Danke, hat sich erledigt, hab es doch noch gefunden.

Für alle die es vielleicht auch mal suchen:

For I = 1 To 4
MsgBox(Me.Controls("Button" & I).Text)
Me.Controls("Button" & I).Text = "Test " & I
Next

Gruß Tommi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 09:16

Und das nächste Problem...

Me.Controls("RadioButton" & I).Tag = "XYZ"
geht einwandfrei.


Hingegen liefert dies einen Fehler

Me.Controls("RadioButton" & I).Checked = True
Fehler: Checked ist kein Member von System.Windows.Form.Control



Die bisherige Anweisung
RadioButton2.Checked = True
funktioniert aber einwandfrei.

Was mache ich falsch?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 09:27

Kurzer Beitrag, der vielleicht doch noch nützlich sein könnte.
http://www.vbarchiv.net/forum/read.php?f=22&t=42478&i=42482

Und Checked ist kein Member von System.Windows.Form.Control, es ist ein Member von RadioButton, was von Control abgeleitet ist.
CType(Me.Controls("RadioButton" & I), RadioButton).Checked
wird die Fehlermeldung verschwinden lassen.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Caddy
Datum: 16.09.11 09:30

Wenn es um alle Buttons, Labels oder so geht geht auch das hier :



   For Each c As Control In Me.Controls
            If TypeOf c Is Label Then c.Visible = True
            If TypeOf c Is Button Then c.Visible = True
            If TypeOf c Is ComboBox Then c.Visible = True
            If TypeOf c Is ListBox Then c.Visible = True
            If TypeOf c Is TextBox Then c.Visible = True
            If TypeOf c Is RichTextBox Then c.Visible = True
        Next
Das funktioniert aber nur mit Eigenschaften, die JEDEM Control eigen ist. Da die Eigenschaft "Checked" nur bei einigen, gesetzt werden kann, geht das nicht.

Allerdings macht es bei Radiobutton keinen Sinn ( meiner Meinung nach) alle auf Checked zu setzen...da sollte man eher Checkboxen nehmen.

Gruss Caddy

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorFZelle (Moderator)
Datum: 16.09.11 09:32

Und wieso willst du diese schlechten VB6 Angewohnheiten nach VB.NET herüberretten?
Es gibt keinen Grund das so zu machen, wenn man mal aufgehört hat in VB6 und "geht doch" zu denken.

Warum meinst du das so machen zu müssen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 09:59

@ DaveS & Caddy

Vielen Dank, ihr habt mir sehr geholfen und schnell noch dazui
Super.


@ FZelle

Wer sagt den das ich schlechte angewohnheiten übernehmen will.
Wenn ich aber die notwendigkeit habe eine Gruppe von Objekte zu
ändern, wie soll ich es den sonst machen als auf den oben beschrieben Weg?

Ich habe rund 25 RadioButtons als Statusanzeige von Verbindungseigenschaften eingesetzt.
Wenn gewisse Bedingungen Erfüllt sind, soll checked auf True

Das Programmiere ich doch nicht 25 mal.
Ich habe eine Routine, die als Parameter die IP-Verbindung als String bekommt.
Und mit diesem Source soll dann entsprechend geprüft und ge"checked" werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 10:18

Ich komme nicht vorwärts :-/

Beim Programmdurchlauf bekomme ich jetzt eine neue Meldung mit der ich nichts anfangen kann:

NullReferenceException wurde nicht behandelt
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


Beitrag wurde zuletzt am 16.09.11 um 10:19:38 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 10:29

Vielleicht zeigst du uns ein wenig Code? Besonders die Zeile mit dem Fehler.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: DotNetErbse
Datum: 16.09.11 10:33

natürlich kannst Du Controls indizieren, Du brauchst nur einen Indexer...


 
Dim lst As New List(Of RadioButton)
with lst
    .Add(RadioButton1)
    .Add(RadioButton2)
    .Add(RadioButton3)
 
    .Item(1).Checked = True
 
end with
es geht sogar das hier, obwohl das m.M.n. Unsinn ist:

lst.Item(0).Checked = True
lst.Item(0).Visible = False
lst.Item(1).Visible = False
Denn warum soll ein nicht sichtbarer Radiobutton selektiert sein dürfen...??
Geht aber...

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 10:33

In der fetten Zeile taucht der Fehler auf



        Dim Versuche As Integer
        Dim Ip As String
 
        For RadioObjectCount = 1 To 9
 
            Select Case RadioObjectCount
                Case 1
                    Ip = "192.168.1.1"
                Case 2
                    Ip = "192.168.1.111"
                Case 3
                    Ip = "192.168.2.1"
                Case 4
                    Ip = "192.168.2.112"
                Case 5
                    Ip = "192.168.71.136"
                Case 6
                    Ip = "192.168.2.254"
                Case 7
                    Ip = "192.168.71.1"
                Case 8
                    Ip = "192.168.30.40"
                Case 9
                    Ip = "192.168.0.254"
            End Select
 
            For Versuche = 1 To 3
                If My.Computer.Network.Ping(Ip) Then
                    If CType(Me.Controls("RadioButton" & RadioObjectCount), _
  RadioButton).Checked() = False Then
                        If Val(Me.Controls("RadioButton" & _
                        RadioObjectCount).Tag) > 3 Then Fehlertext$ = _
                        Fehlertext$ & Date.Now & "  -  " & Me.Controls( _
                        "RadioButton" & RadioObjectCount).Text & " wieder" & _
                        "verfügbar" & vbCrLf
                    End If
                    CType(Me.Controls("RadioButton" & RadioObjectCount), _
                      RadioButton).Checked() = True
                    Me.Controls("RadioButton" & RadioObjectCount).Tag = "0"
                    Versuche = 3
                Else
                    If Versuche = 3 Then
                        CType(Me.Controls("RadioButton" & RadioObjectCount), _
                          RadioButton).Checked() = False
                        Me.Controls("RadioButton" & RadioObjectCount).Tag = Val( _
                        Me.Controls("RadioButton" & RadioObjectCount).Tag) + 1
                    End If
                End If
            Next
            ProgressBar1.Value = RadioObjectCount : Application.DoEvents()
        Next
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 10:53

Ich schätze, dass das Objekt "RadioButton" & RadioObjectCount nicht existiert (in Me.Controls).

Die Fehlermeldung bedeutet, dass man versucht ein nicht-existierendes Objekt anzusprechen.

Und um den Vorschlag von DNE etwas auszubauen und die Erklärung von "Melkor" heranzuziehen, du könntest die Daten für ein RadioButton in einer Structure deklarieren

    Public Structure RBData
        Public Property RB As RadioButton
        Public Property IP As String
        Public Property Versuche As Integer
        Public Sub New(ByVal RB As RadioButton, ByVal IP As String)
            Me.RB = RB
            Me.IP = IP
        End Sub
    End Structure
 
    Public RBS As New List(Of RBData)
 
    Private Sub Test()
        RBS.Add(New RBData(RadioButton1, "192.168.10.1"))
        ' ...
 
        RBS(i).RB.Checked = True
        Ping(RBS(i).IP)
        RBS(i).Versuche += 1
 
        ' usw
    End Sub
Dann kanst du die Controls und Daten bequem über Index ansprechen und verwalten. Es gibt in .Net viele Möglichkeiten, die man in VB6 nicht hatte.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 11:06

@DaveS

Danke für den Source. Der übersteigt aber leider meinen Horizont, da verstehe ich nur Bahnhof.

Es fängt schon damit an, das ich nicht den Sinn erkenne, Objekte zur Laufzeit zu erzeugen.
Ich habe doch dann einen viel höheren Aufwand diese per Code zu positionieren... oder hab ich da noch einen Gedankenfehler?

Deshalb war es mir bisher immer lieber die Objekte die brauche selbst auf der Form zu plazieren als zur Laufzeit zu generieren.

Bisher hat mir das noch niemand vernünftig erklären können.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 11:18

So, ich bin jetzt wieder ein kleines Strück weiter:

Also:

Wenn ich ein neues Projekt starte und 4 Radiobuttons plaziere funktioniert das
"checked" setzen einwandfrei.

Nicht aber in meiner App.

Der Unterschied ist, das dort alle RadioButtons in einem eigenen Panel sitzen.
Der Grund dafür besteht darin, das ich JEDES RadioButton unabhängig vom Zustand
der andern setzen muss, ohne diese zu verändern.

Ich könnte ja irgendetwas anderes zum signalisieren nehmen, aber inzwischen geht es hier ums Prinzip Ich würde es gerne verstehen... und vor allem... so ans laufen bekommen um zu lernen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 11:21

Da werden keine Controls zur Laufzeit angelegt. Nur eine Liste wird gebaut, mit den relevanten Daten drin, die du weiter im Code per Index ansprechen willst. Um deinen Code zum Teil (schnell und ungetestet) entsprechend anzupassen was rauskommt wäre sowas wie
    For RadioObjectCount = 0 To RBS.Count - 1
        For Versuche = 1 To 3
            If My.Computer.Network.Ping(RBS(RadioObjectCount).IP) Then
                If Not RBS(RadioObjectCount).RB.Checked Then
                    If RBS(RadioObjectCount).Versuche > 3 Then Fehlertext = _
                      Fehlertext & _
                      Date.Now & "  -  " & RBS(RadioObjectCount).RB.Text & _
                      " wieder verfügbar" & vbCrLf
                End If
                RBS(RadioObjectCount).RB.Checked = True
                RBS(RadioObjectCount).Versuche = 0
            ' ....       
        Next
        ' ...
    Next

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 11:22

Dann macht es noch mehr Sinn die Controls in einem Array (oder besser wie hier einer List(Of )) abzulegen, weil man sonst die Panels zuerst ansprechen müßte. Meistens verwendet man eine CheckBox wenn die Optionen voneineander unabhängig sind.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: DotNetErbse
Datum: 16.09.11 12:13

Betrifft nicht Deine OptionsButtons, aber:

Objekte zur Laufzeit

Stelle Dir ein Bestellsystem vor, bei dem Du zu einem Produkt jeweils verschiedene Zusatzprodukte mitbestellen kannst. Die Produkte sind in einer Datenbank gespeichert, die Zusatzprodukte ebenfalls in der DB in einer relationalen Tabelle mit Verweis auf Deine Hauptprodukte

z.B.:

[Hauptprodukt] Fahrrad
[Zusatzprodukt] Luftpumpe
[Zusatzprodukt] Klingel
[Zusatzprodukt] Halogenlicht vorne
[Zusatzprodukt] LED-Licht hinten
[Zusatzprodukt] Satteltaschen

[Hauptprodukt] Motoroller
[Zusatzprodukt] Luftpumpe
[Zusatzprodukt] Hupe
[Zusatzprodukt] Helm

Willst Du in Deiner Bildschirmmaske die Checkbuttons ALLER Zusatzprodukte vorhalten und nur DIE PASSENDEN anzeigen ??? Wieviele sollen es denn bitteschön sein??? 10, 100, 1000 ???

Die bessere Variante wäre doch, die Checkboxen entsprechend ihrer Benötigung überhaupt erst zu erstellen. Text, CheckedStatus und Eventhandler inklusive...

Mit freundlichen Gr??en
DotNetErbse


[Es hei?t Paket und nicht Packet, auch wenn Standard augenscheinlich von Standar(t)e kommt,hei?t es dennoch Standar(d)]

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 12:26

@DaveS

Vielen Dank für deine Mühe und Geduld.

Ich habe es jetzt am laufen... und... was noch viel wichtiger ist!! ICH HAB'S VERSTANDEN
Du hast mir wirklich sehr weitergeholfen, Danke.



@DotNetErbse

Nach dem Beitrag von Dave habe ich jetzt auch deinen verstanden, der ja in etwa auf das gleiche abzielt.
zu deinem letzten Beitrag: Ist klar, ich will nicht bestreiten, das es irgendwo sinn macht, ich bin bisher gut ohne ausgekommen weil mir die Plazierung dann einfach aufwändfig war.
In deinem Beispiel hätte ich eine DB und eine OptionsListe benutzt...

Aber... es führen viele Wege nach Rom


Mein Programm läuft jetzt jedenfalls.
Wenn ich es gestestet habe, kann ich es ja noch einmal mit dem Funktionierenden Source einstellen.
Danke für eure Mühe
Tommi
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 16.09.11 12:32

Da waren so einige Fehler im zweiten Beispiel (habe ich jetzt etwas verbessert) aber wenn du es verstanden hast, das ist Hauptsache.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 16.09.11 13:08

Ja, hatte die auch schon gefunden, hatte erst den ganzen Christbaum an.
Aber war vielleicht auch ganz gut so, durch das Fehlersuchen habe ich
es jetzt auch verstanden
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 22.09.11 10:29

Nachdem ich jetzt einige Zeit damit gearbeitet habe und dachte ich käme jetzt zurecht,
hat sich da doch noch ein Problem aufgetan:

Ich habe der Struktur unter anderem ein Integer-Feld hinzugefügt.
Funktioniert auch soweit einwandfrei.

Jetzt möchte ich aber den Inhalt ändern, wenn sich im zugehörigen Textfeld der Wert ändert
DB_FreeSpace(ObjectCount).NetDriveAlert = Val(DB_FreeSpace( _
  ObjectCount).Txt_NetSpaceAlert.Text)
Bei diese Eingabe bekomme ich die Fehlermeldung:
Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden.

Was mache ich falsch?

Beitrag wurde zuletzt am 22.09.11 um 10:31:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: ModeratorDaveS (Moderator)
Datum: 22.09.11 10:42

Eine Structure musst du komplett zuweisen, etwa so
        Dim mystruct As theStruct = DB_FreeSpace(ObjectCount)
        mystruct.NetDriveAlert = 123
        DB_FreeSpace(ObjectCount) = mystruct
(Und .ToString() auf der linken Seite einer Zuweisung ist natürlich Quatsch). Das ist übrigens eine der Gründe warum FZelle immer so gegen Structures ist (glaube ich). Meiner Meinung nach haben Structures ihre Rolle im Leben und sind in vielen Fällen sinnvoll. Die andere Möglichkeit ist alles als Class zu deklarieren (damit hat man eventuell andere Probleme).

Und bitte CInt() CDbl() oder Integer.Parse(), Convert.ToInt32() usw verwenden, nicht Val().

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Wie kann ich Objekte unter VB.Net indizieren ??? 
Autor: Tommi467
Datum: 22.09.11 10:54

Danke, es geht

und

Ich hab's verstanden
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel