TextBox oder Label?

  • Allgemein

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    TextBox oder Label?

    Hallo Zusammen,

    Ich hab ein array (a(0, 1) aus TextBox Name und Text von "Form1"

    Hier in Form2 will ich die Form1 aufbauen, das geht auch wunderbar, jedoch will ich entscheiden können ob Textboxen und/oder Labels daraus gemacht werden sollen in einer sub

    Jetzt erstellt CreateTxb() einfach Textboxen..
    Nun sollte es irgendwie CreateTxb(ByVal lblortxb As ????) sein..resp. CreateForm

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form2
    2. Dim a = Form1.GetFieldData()
    3. Dim b As Integer = 0
    4. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. CreateTxb()
    6. End Sub
    7. Private Sub CreateTxb()
    8. Dim txar((a.Length - 2) / 2) As TextBox
    9. Dim i As Integer = 0
    10. Dim TabIndex As Integer = 0
    11. i = (a.Length - 2) / 2
    12. While i <= (a.Length - 2) / 2
    13. 'was tun
    14. txar(i) = New TextBox
    15. With txar(i)
    16. .Parent = Me
    17. .Parent.Controls.Add(txar(i))
    18. .Name = a(TabIndex, 0)
    19. .TabIndex = i
    20. .Text = a(TabIndex, 1)
    21. .AutoSize = False
    22. .Location = New Point(10, 10 + i * 2 * .Height)
    23. .Visible = True
    24. End With
    25. 'MsgBox(a(i, 0) & a(i, 1))
    26. 'Befehlsende
    27. i = i - 1
    28. TabIndex = TabIndex + 1
    29. If i < 0 Then
    30. Exit While
    31. End If
    32. End While
    33. End Sub
    34. End Class

    Vielen Dank für die Antworten

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „syntax“ ()

    Abgesehen davon wäre für die Positionierung der Elemente ein Flowlayoutpanel eine Alternative. Erspart das Berechnen der Position.
    Das Beispiel ist ausgehend von der Aufgabenstellung, nicht von deiner Lösung:

    Spoiler anzeigen

    Verwendet wurde eine Form mit zwei Radiobuttons, einem Button und einem Flowlayoutpanel

    VB.NET-Quellcode

    1. Public Class Form1
    2. Enum enumneuesElement
    3. textbox
    4. label
    5. End Enum
    6. Dim neueselement As enumneuesElement
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Dim element As Control
    9. Select Case neueselement
    10. Case enumneuesElement.textbox
    11. element = New TextBox
    12. Case enumneuesElement.label
    13. element = New Label
    14. Case Else
    15. Exit Sub
    16. End Select
    17. element.Text = "neues Element"
    18. element.Visible = True
    19. FlowLayoutPanel1.Controls.Add(element)
    20. End Sub
    21. Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
    22. neueselement = enumneuesElement.textbox
    23. End Sub
    24. Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
    25. neueselement = enumneuesElement.label
    26. End Sub
    27. End Class


    Die Logik hinter dem Erstellen verschiedener Elemente in EINER Sub erschließt sich mir zwar nicht ganz, aber sei's drum.

    syntax schrieb:

    VB.NET-Quellcode

    1. Dim a = Form1.GetFieldData()
    Was ist denn das für ein un-instanziierter Crap-Zugriff auf eine andere Form?
    Informiere Dich mal über Instanzen fon Formen.
    Einen OpenFileDialog erstellst Du doch auch per New.
    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!
    Vielen Dank für die Antworten. Hab es nun gelöst =)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. CreateTxb()
    4. End Sub
    5. Private Sub CreateTxb()
    6. 'a(i, 0) & a(i, 1)
    7. Dim a = Form1.GetFieldData()
    8. Dim x As Integer = 0
    9. Dim ic As Integer
    10. Dim element As Control = Nothing
    11. For c = 0 To 1 'Anzahl Elemente
    12. Dim i As Integer = (a.Length - 2) / 2
    13. Dim index As Integer = 0
    14. Dim txar(i)
    15. While i <= (a.Length - 2) / 2
    16. Select Case ic
    17. Case 0
    18. element = New Label
    19. x = 10
    20. Case 1
    21. element = New TextBox
    22. x = 50
    23. End Select
    24. txar(i) = element
    25. With txar(i)
    26. .Parent = Me
    27. .Parent.Controls.Add(txar(i))
    28. .Name = a(index, 0)
    29. .TabIndex = i
    30. .Text = a(index, 1)
    31. .AutoSize = True
    32. .Location = New Point(x, 10 + i * 2 * 15)
    33. .Visible = True
    34. End With
    35. i = i - 1
    36. index = index + 1
    37. If i < 0 Then
    38. Exit While
    39. End If
    40. End While
    41. ic = ic + 1
    42. Next
    43. End Sub
    44. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „syntax“ ()

    syntax schrieb:

    VB.NET-Quellcode

    1. Dim a = Form1.GetFieldData()
    Hast aber leider nix dazugelernt. :S
    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!
    Nicht ganz, denn wahrscheinlich hast Du iwo in Deinem Projekt eine "normale" Instanz von Form1 (Startform oder so), da musste die Instanz mit Me zu einer entsprechenden Property in der aktuellen Instanz der Form2 übertragen.
    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!
    @syntax:
    Form1 ist eine Klasse. Oder anders ausgedrückt ein Bauplan.
    f1 (bei Dir) ist eine Instanz der Klasse. Also wie ein Haus, das Du nach dem Bauplan gebaut hast.

    Form1.GetFieldData aufzurufen ergibt keinen Sinn. (Ja, haut mich. Wir lassen statische Member mal weg.)
    Du fährst ja auch nicht mit dem Bauplan eines Autos, sondern mit einem Auto, das nach dem Bauplan gebaut wurde.

    Wenn Du Dir selbst einfach verbietest, Klassenname.Irgendwas aufzurufen, dann ergibt sich das meiste von selbst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hey,

    eine Möglichkeit z. B. ist, dass Du im Konstruktor der Form2 einfach einen Verweis auf Form1 mitgibst. Gibt mehrere Möglichkeiten, so etwas zu lösen.

    Beispiel:

    Code Form1:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Function GetFieldData() As String
    3. Return "huhu"
    4. End Function
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Dim f2 As New Form2(Me)
    7. f2.Show()
    8. End Sub
    9. End Class


    Code Form2:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private _instForm1 As Form1
    3. Public Sub New(ByVal instForm1 As Form1)
    4. InitializeComponent()
    5. _instForm1 = instForm1
    6. End Sub
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. MessageBox.Show(_instForm1.GetFieldData())
    9. End Sub
    10. End Class


    Eine andere Möglichkeit ist auch, dass Du GetFieldData in Form1 als "Shared" Deklarierst, dann ist der Zugriff über den Klassennamen legitim:

    VB.NET-Quellcode

    1. Public Shared Function GetFieldData() As String
    2. Return "huhu"
    3. End Function
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das ist eine gute Frage. Auf die kann ich Dir aber keine Antwort geben.
    Ich kann Dir nur diesen Hinweis geben: Wenn GetFieldData() auf nichts weiteres zugreift, was sich in Form1 befindet, dann gehört die Funktion in Form2.
    Wenn die Funktion aber auf gewisse Sachen zugreift, dann musst Du Dein Anwendungsdesign überdenken.
    wenn Form2 eine Art dialog ist, dann kannst Du es so machen:

    VB.NET-Quellcode

    1. Sub XY()
    2. Using Dlg As New Form2
    3. Dlg.SetFieldData(GetFieldData)
    4. If Dlg.ShowDialog = DialogResult.OK Then
    5. '...
    6. End If
    7. End Using
    8. End Sub

    Hier wird die Funktion GetFieldData innerhalb von Form1 aufgerufen und das Ergebnis wird an die Instanz von Form2 gegeben.
    Im Grunde wie jeder OpenFileDialog / ColorDialog / etc.

    Generell sollte man eine Form wirklich nur als eine Schnittstellen zwischen dem Benutzer und dem Programm verwenden. Man ist es gewohnt, dass man alle Programmatischen Sachen in Form1 o.ä. hat. Das ist meistens völlig ausreichend, aber wenn es komplizierter wird, sollte man die Dinge aus der Form1-Klasse raus nehmen.
    Dann hast Du eine schöne Baumstruktur.
    Das Teil im Hintergrund kümmert sich um Daten, auf den Forms werden die Daten angezeigt bzw. die Daten kommen von den Forms.
    Innerhalb der Form kannst Du dann "Aufgaben" gruppieren und für das Teil im Hintergrund leichter zugreifbar machen.
    Z.B. befinden sich zwei drei TextBoxen und 'ne ComboBox auf der Form. In Form2 werden die Daten für die Verarbeitung aufbereitet und im Teil im Hintergrund greift man dann nicht mehr auf f2.TextBoxXY und f2.ComboBoxABC zu, sondern nur noch auf f2.SelectedBla.
    (Ja, mir ist nichts besseres als "Teil im Hintergrund" eingefallen)


    Edit: @SpaceyX:
    Das sollte im Normalfall nicht nötig sein.
    Wenn Form2 die Daten wirklich von Form1 haben muss, dann gibt man nicht die komplette Form1 mit, sondern nur die Daten, die man braucht. Und wenn Form2 die Daten erst später benötigt, dann kann man ein Callback verwenden.
    Die Form2-Klasse hat dann eine Property vom Typ Func(Of WasGetFieldDataZurückGibt)

    VB.NET-Quellcode

    1. 'Initialisieren einer Instanz von Form2
    2. f2.GetFieldDataCallback = AddressOf GetFieldData

    In Form2 wird dann folgendes verwendet:

    VB.NET-Quellcode

    1. Dim Data = GetFieldDataCallback() 'Klammern nicht vergessen, sonst wird der Delegat nicht ausgeführt, sondern es wird ein Verweis auf den Delegat in "Data" abgelegt.


    AddressOf erstellt einen Delegat, der "auf GetFieldData zeigt" (Die Funktion GetFieldData befindet sich in Form1).
    Dieser Delegat wird an die Instanz von Form2 gegeben und dieser Delegat wird dann aufgerufen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils