Array von Controls über Index ansprechen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    Array von Controls über Index ansprechen

    Hallo, VB-Freunde
    Ich habe in FormLoad mit

    VB.NET-Quellcode

    1. Dim Gruppe() As TextBox = New TextBox() {Me.TextBox1, Me.TextBox2, Me.TextBox3}

    3 Textfelder zu einem Controlarray zusammengefasst.
    a) Ich möchte jetzt mit Hilfe einer Schleife in jedes der 3 Textfelder seinen Namen hineinschreiben lassen.
    b) Ich möchte jetzt mit Hilfe einer Schleife in jedes der 3 Textfelder seinen Index hineinschreiben lassen.
    Danke für eure Antworten und mfg, Adi
    Hallo picoflop!

    Ich habe doch genau angegeben, was ich machen möchte. Mein Problem ist, dass ich jahrelang mit VB 6 programmiert habe. Dort konnte ich für ein Array von Textfeldern einfach schreiben:

    VB.NET-Quellcode

    1. For i = 0 to 3
    2. Gruppe(i).Text=i
    3. Next i
    So etwas klappt aber in VB 2008 nicht mehr!

    mfg, Adi
    Wenn du nur 3 Items im Array hast dann gehts auch nur von 0 bis 2..

    VB.NET-Quellcode

    1. Dim Gruppe() As TextBox = New TextBox() {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    2. For i = 0 To 2
    3. Gruppe(i).Text = i
    4. Next


    geht einwandfrei..
    gruss mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo, Mono!

    Dass die Schleife bis 3 geht, ist nur ein Tippfehler. Mein Problem ist folgendes. Wenn ich die Dim-Zeile und die Schleife beide in FormLoad schreibe, dann klappt's. Ich möchte aber an jeder Stelle des Programms auf mein Controlarray "Gruppe" zugreifen können. Also habe ich die Dim-Zeile gleich unter Public Class Form geschrieben. Wenn ich dann in irgendeiner anderen Sub mit obiger Schleife darauf zugreifen will, gibt's folgende Fehlermeldung: NullReferenceException wurde nicht behandelt.
    Wie und/oder wo muss ich also mein Array definieren, damit ich in jeder Sub auf die einzelnen Elemente zugreifen kann?
    Danke für eure Antworten und mfg, Adi
    Ich hab’s jetzt :thumbsup:
    Wenn ich die Dim-Zeile aufteile, einmal in den allg. Deklarationsabschnitt und die eigentliche Definition mit New in FormLoad, dann habe ich im ganzen Programm Zugriff auf alle Teile meines Arrays. Für alle, die ein solches Problem schon mal hatten, hier mein Lösungscode:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Gruppe() As TextBox
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Gruppe = New TextBox() {Me.TextBox1, Me.TextBox2, Me.TextBox3}
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim i As Byte
    8. For i = 0 To 2
    9. Gruppe(i).Text = i
    10. Next
    11. End Sub
    12. End Class



    mfg, Adi

    Adi schrieb:

    Also habe ich die Dim-Zeile gleich unter Public Class Form geschrieben. Wenn ich dann in irgendeiner anderen Sub mit obiger Schleife darauf zugreifen will, gibt's folgende Fehlermeldung: NullReferenceException wurde nicht behandelt.

    Na klar. Die Deklarationen werden abgearbeitet bevor InitializeComponent() aufgerufen wurde. Und erst dort werden die Controls erzeugt.

    Denke mal das meine Frage hier rein passt

    Das hier gepostete hat mir schon sehr geholfen. Ich fand das mit dem Index in VB 6 eigentlich immer sehr angenehm. Nur aber zu meiner Frage:

    Wie verhält sich das, wenn ich einen Code ausführen möchte, wenn ich auf ein LABEL klicke?

    In VB 6 hatte es ja den Index gegeben und da reichte es den Code über den Index zu schreiben

    Bsp:


    VB.NET-Quellcode

    1. Private Sub lblCounter_txt_Click(Index As Integer)
    2. if Index = 1 then
    3. .....
    4. .....
    5. .....
    6. End If
    7. End Sub


    Ich habe ein Script mit bis zu 20 Counter und möchte ermöglichen, das ein noch nicht abgelaufener Counter gelöscht werden kann.

    Gruss Heiko
    mach eine Methode für alle Labels und greife über die sender Eigenschaft auf diese zu, die sender Eigenschaft musst du noch mit DirectCast in ein Label konvertieren, dass du dieses anschließend benutzen kannst...die sender Eigenschaft gibt das Control an, von welchem das Event ausgelöst wurde...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. Sub Labels_Clicked(sender As object, e As System.Eventargs)Handles Label1.Click,Label2.Click,Label3.Click ...
    2. Dim lbl As Label = DirectCast(sender,Label)
    3. 'lbl ist jetzt das Label, welches das Event aufgerufen hat, mit lbl kannst du alle Eigenschaften verändern und auslesen...
    4. End Sub
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Guten Morgen jvbsl,

    Ich habe Folgende Felder:
    INDEX - DATUM/ZEIT - BEMERKUNG - TON

    Spalte Index nenne ich mal Zeilenweise lbl_Counter_IDX01 ... lbl_Counter_IDX20
    Spalte Bemerkung lbl_Counter_BEM01 ... lbl_Counter_BEM20

    Wenn man auf das Bemerkungsfeld klickt so brauche ich den Wert (Inhalt) der im Feld Index steht.

    VB.NET-Quellcode

    1. Sub Labels_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
    2. lbl_Counter_IDX01.Click, _
    3. lbl_Counter_IDX02.Click, _
    4. lbl_Counter_BEM01.Click, _
    5. lbl_Counter_BEM02.Click, _
    6. Dim lbl As Label = DirectCast(sender, Label)
    7. lbl.Text = "HIER SOLL DER INHALT VON lbl_Counter_IDXnr STEHEN" 'hier natürlich später der Wert in einer Variable
    8. End Sub


    Dein Codebeispiel funktioniert, wenn ich lbl.Text = "Test" schreibe, aber wie erhalte ich den Inhalt von der Index-Spalte?



    Gruss Heiko
    |-------------------------------------
    | INDEX | Datum / Zeit | Bemerkung
    |-------------------------------------
    | 212 | 06.08.2010 xx | Test

    Wenn ich auf Bemerkung klicke, so brauch ich den Wert der im Feld Index steht ;)

    Also wenn ich auf das Feld Test klicke .... so benötige ich den Wert 212



    Gruss Heiko