generische Textboxen indizieren

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von schnorklunder.

    generische Textboxen indizieren

    Hallo Leute,

    ich möchte Textboxen generisch erstellen lassen, welche sich aus der Anzahl der Items einer Listview ergeben (bei 2 Items = 4 Textboxen, bei 5 Items 25 Textboxen...)

    VB.NET-Quellcode

    1. Public txtBox As New TextBox
    2. Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
    3. Dim xStart = 960
    4. Dim yStart = 76
    5. For c = 1 To ListView1.Items.Count
    6. For d = 1 To ListView1.Items.Count
    7. xStart = xStart + 44
    8. yStart = yStart
    9. txtBox(c, d).Location = New Size(xStart, yStart)
    10. Me.Controls.Add(txtBox(c, d))
    11. Next
    12. xStart = 960
    13. yStart = yStart + 28
    14. Next
    15. End Sub


    Leider kommt die Fehlermeldung: Die Klasse "System.Windows.Forms.TextBox" kann nicht indiziert werden, da sie keine Standardeigenschaft hat.


    Kann mir jemand sagen, wie ich das hinkriegen kann?

    Viele Grüße

    Stefan
    Wo kommt die Fehlermeldung (Zeile)?

    Wenn du schon generisch arbeitest, warum dann nicht die Textbox generisch an Daten binden? Weil wenn ich 10 Einträge hab sind es ja schon 100 Boxen... wo willst du die Unterbringen? Performance == 0...
    Macht glaube ich keinen Sinn.

    Ansonsten... hast du eine Textbox, die du immer verwendest. Würde also ohne Fehler auf fehlschlagen, weil du eben nur eine hast. (List(Of IControl)
    Hallo Kagurame,

    die Fehlermeldung kommt in der Zeile 11 und 12 (da wo sie indiziert werden sollen)

    Die Performance darf in diesem Beispiel außer Acht gelassen werden, wichtig ist mir das es hinhaut (die Liste wird nicht lang, es geht nur darum das es klappt)

    Viele Grüße

    Stefan
    Mit oder ohne List... du arbeitest mit einer Referenz auf ein Objekt, könnte also dennoch fehlschlagen (Da die Referenz eben auf ein Objekt im Speicher verweist, habe das Add gesehen... aber sie dürften alle auf die selbe eine textbox verweißen).

    Veruche mal bei der Initialisierung deiner TB folgendes:

    VB.NET-Quellcode

    1. Dim txtBox As New TextBox With {. ... , . ...}


    Wobei du hinter dem ersten Punkt dann mögliche Probs geliefert bekommst, du kannst also die tb mit verschiedenen Werten vorinitialisieren, schau mal da, was da so steht. Vielleicht hilft dir das. (Habe grade keinen Designer zur Hand, sonst würd ich schnell gucken)
    Hallo,
    1. wie Kagurame schon geschrieben hat, mußt du in jedem Schleifendurchlauf eine neue Instanz erzeugen. (tb(X,Y)=New Textbox)
    2. Deine Daklaration muß denne natürlich auch ein Array entsprechender Dimensionierung sein. Diese Dimensionierung muß dann auch die For-Schleife begrenzen

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Also ich hab mal versucht den 1. Hinweis in den Code einzupflegen, sodass in jedem Schleifendurchlauf eine Instanz erzeugt wird

    VB.NET-Quellcode

    1. For c = 1 To ListView1.Items.Count
    2. For d = 1 To ListView1.Items.Count
    3. Dim txtBox(c, d) As TextBox
    4. xStart = xStart + 44
    5. yStart = yStart
    6. txtBox(c, d).Location = New Size(xStart, yStart)
    7. Me.Controls.Add(txtBox(c, d))
    8. Next
    9. xStart = 960
    10. yStart = yStart + 28
    11. Next


    So kriege ich allerdings eine neue Fehlermeldung "NullReferenceException"

    VB.NET-Quellcode

    1. Dim txtBox(c, d) As New TextBox


    das geht aber wiederrum nicht, da Arrays nicht mit New deklariert werden dürfen, was sicher mit deinem 2. Hinweis zu tun hat.

    Ich verfranz mich aber irgendwie bei der Array-Definition

    Mein Versuch (scheitert, Fehlermeldung =Die Variable "txtBox" verbirgt eine Variable in einem einschließenden Block.)

    VB.NET-Quellcode

    1. Dim A(c, d) As Single
    2. For r = 0 To c
    3. For t = 0 To d
    4. Dim txtBox(c, d) As TextBox
    5. Next
    6. Next


    Irgendwie komme ich so nicht weiter, was mach ich falsch?
    Probier es mal so:

    VB.NET-Quellcode

    1. Private txtBox(3, 4) As TextBox
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. For i As Integer = 0 To 3
    4. For j As Integer = 0 To 4
    5. txtBox(i, j) = New TextBox
    6. Next
    7. Next
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim xStart As Integer = 960 'Startpunkt.x
    2. Dim yStart As Integer = 76 'Startpunkt.y
    3. Dim offsetx As Short = xStart 'Mit diesen Werten wird gearbeitet
    4. Dim offsety As Short = yStart
    5. Dim index1 As Integer 'diese beiden Werte dienen der Benennung
    6. Dim index2 As Integer
    7. For Each item1 As ListViewItem In ListView1.Items
    8. index1 = ListView1.Items.IndexOf(item1) 'Hier wird der Index der ersten Schleife ermittelt
    9. For Each item2 As ListViewItem In ListView1.Items
    10. index2 = ListView1.Items.IndexOf(item2) 'Hier wird der Index der zweiten Schleife ermittelt
    11. offsetx += 44 ' Hier wird die xPosition bestimmt
    12. Dim txtBox As New TextBox 'neue Textbox erzeugen
    13. With txtBox
    14. .Name = "txtbox" & index1 & index1 'Name bestimmen
    15. .Location = New Point(offsetx , offsety) 'Position bestimmen
    16. End With
    17. Me.Controls.Add(txtBox) 'Control hinzufügen
    18. Next
    19. offsetx = xStart 'x zurücksetzen
    20. offsety += 28 'y hochzählen
    21. Next
    22. Me.Refresh() 'hier werden die Controls gezeichnet


    Wobei ich aber nicht verstehe warum du eine einzelne Listview zweimal durchläufst....
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Wobei ich aber nicht verstehe warum du eine einzelne Listview zweimal durchläufst....
    :thumbsup:
    Das wird er merken, wenn der Rest einigermaßen läuft.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!