Contols auslesen und an RTB übergeben...

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VBHunter.

    Contols auslesen und an RTB übergeben...

    Hi Leute ,

    ich grübele die ganze Zeit wie ich mein Problem gelöst bekomme :/ . Vielleicht könnt ihr mir Helfen :)


    Ich habe eine Form die Panel hat (Panel1), dort sind verschiedene Steuerelemente (siehe Bild)



    Diese sind im Panel vorgegeben, dort kann man verschiedene dinge eintragen (Datetimepicker, NumericUpDown) bzw. auswählen (Combobox, Checkbox).

    Oberhalb des Panels habe ich ein Button um die gleiche Zeile mit den Steuerelementen zu erstellen per Control.

    So sieht es nach dem Klick aus:



    Alles schön und gut ^^.

    ABER !!!!

    Ich möchte jetzt die einzelnen Zeilen in einer Richtextbox übertragen, per Klick auf einen zweiten Button.

    Also alles was ausgefüllt wurde aus Zeile 1 in RichTextBox1.Lines(0) das gleiche wenn bei Zeile 2 etwas ausgefüllt wurde, etc....

    Bei Zeile 1 ist das ja nicht so das Problem etwa so
    RichTextBox1.Lines(0) = Label1.Text & Format(DateTimePicker1.Value, "HH:mm") & ComboBox1.SelectedText & Format(DateTimePicker2.Value, "HH:mm") & ComboBox2.SelectedText & ComboBox3.SelectedText & NumericUpDown1.Value & NumericUpDown2.Value & CheckBox1.Checked

    Nur wie kann ich auslesen was der Benutzer in die 2. Zeile eingetragen hat und dies dann in .Lines(1) ... etc. übertragen?


    So werden meine Controls erstellt (nehme als Beispiel nur den Datetimepicker1):

    VB.NET-Quellcode

    1. i +=1
    2. Try
    3. Dim Dtp2 As New Datetimepicker
    4. Dim Dtp2X As Integer = Dtp1.Location.X ' Dtp1 ist das Feste Steuerelement (vorgegebene aus Zeile 1) Datetimepicker
    5. Dim Dtp2Y As Integer = Dtp1.Location.Y
    6. For Each T As Control In Panel1.Controls
    7. If TypeOf T Is DateTimePicker AndAlso T.Location.Y > Dtp1Y Then Dtp1Y = T.Location.Y
    8. Next
    9. With Dtp2
    10. .Name = "DatetimePicker_" & i
    11. .Format = DateTimePickerFormat.Custom
    12. .CustomFormat = "HH:mm"
    13. .ShowUpDown = True
    14. .Size = Dtp1.Size
    15. .Value = "01.01.2000 00:00"
    16. .Location = New Point(Dtp1.Location.X, Dtp2Y + 30)
    17. End With
    18. Panel1.Controls.Add(Dtp2)
    19. Catch ex As Exception
    20. MessageBox.Show("Fehler beim hinzufügen!")
    21. End Try


    Ich habe schon versucht das so zu lösen, aber ohne erfolg.

    AddHandler Dtp2.TextChanged, AddressOf Dtpaenderung <---- in With Dtp2

    VB.NET-Quellcode

    1. Private Sub Dtpaenderung(sender As Object, e As EventArgs)
    2. Dim Dtp As DateTimePicker
    3. Dtp= CType(sender, DateTimePicker)
    4. Dim Str As String = Format(Dtp.Value, "HH:mm")
    5. RichTextBox1.Text = Str & vbNewLine
    6. End Sub


    wenn ich jetzt eine weitere Zeile hinzufüge (Zeile 3) und da den Dtp ändere wird meine ebend übertragende Uhrzeit vom Dtp wieder geändert und in die gleiche Zeile hinterlegt.

    Ich hoffe Ihr könnt mich halbwegs verstehen und könnt mir ein wenig Helfen. ICH DANKE EUCH im vorraus ^^
    Also wenn der Aufbau immer so sein soll und man immer nur ganze Zeilen hinzufügen kann, dann mach Dir aus dem ganzen Gesums ein UserControl (UC). Und dann musst Du nur das hinzufügen. Dann kommen alle anderen CEs mit. Dem UC kannst Du dann auch noch eine Function hinzufügen, die all seine CE-Inhalte als einen String wiedergibt. ABER! Was soll das werden, wenn's fertig ist? Denn das Schreiben von CE-Properties in eine (Whatever)TextBox, also die Umwandlung in einen String, ist meist der erste Schritt zum Speichern und Wiederherstellen von Einstellungen. Und wenn das Dein Plan ist, ist dies der falsche Weg, denn zum Speichern von Properties werden keine Strings verwendet. Von daher (wiederholt): Was soll das werden, wenn's fertig ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke @Morrison das ist ein guter hinweis, kenn mich in diesen Bereich Propertys zwar nicht so aus aber habe gerade ein wenig Gegoogelt und Youtube benutzt und es sieht so aus als würde es auch mein Code um einiges kürzen, werde mal morgen versuchen es so umzusetzen.

    @VaporiZed Sorry das hatte ich vergessen zu erwähnen. Es soll sowas wie ein Bericht werden

    Label vorne = Zeilenangabe
    DTP = Wann man mit seiner Arbeit begonnen hat
    Combobox = Was man gemacht hat (wählt man z.b. fahrt nach XY)
    DTP = Wann man eine Arbeit beendet hat
    Combobox = Was man gemacht hat (wählt man z.b. fahrt nach XY)
    Combobox = Welches FZ man fuhr
    NumericUpDown = FZ Nummer
    NumericUpDown = Personenanzahl im FZ beim Transport
    Checkbox = Ohne Vorkommnisse ja oder nein
    Mit ein wenig Erfahrung lässt sich sowas komplett in einem DGV realisieren. Ggf. noch ein tDS anschließen und dann geht fast alles ohne eigenen Code, sondern das meiste per DataBinding. Das einzig "schwierige" an der Sache ist, dass man spezielle Spalten für DTP und NUD implementieren müsste. Dazu gibt's im Forum n bisken was zu finden. Oder man macht es ohne und verwendet TextBox-Columns, deren Inhalt man dann parst. Aber er Weg, den Du einschlagen willst, ist Pfeil-Rücken-Brust-Auge.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So habe mir jetzt eine Klasse erstellt aber irgendwie klappt das noch nicht mit dem anzeigen ....

    hier meine Klasse:

    VB.NET-Quellcode

    1. Public Class Dienste
    2. Public Property ID As Integer
    3. Public Property Dienstbeginnzeit As String
    4. Public Property Dienstbeginnort As String
    5. Public Property Dienstendezeit As String
    6. Public Property Dienstendeort As String
    7. Public Property Dienstline As String
    8. Public Property Dienstkurs As String
    9. Public Property Dienstroute As String
    10. Public Property Dienstf As String
    11. Sub New()
    12. End Sub
    13. Sub New(mID As Integer, mDienstbeginnzeit As String, mDienstbeginnort As String, mDienstendezeit As String, mDienstendeort As String, mDienstlinie As String, mDienstkurs As String, mDienstroute As String, mDienstf As String)
    14. ID = mID
    15. Dienstbeginnzeit = mDienstbeginnzeit
    16. Dienstbeginnort = mDienstbeginnort
    17. Dienstendezeit = mDienstendezeit
    18. Dienstendeort = mDienstendeort
    19. Dienstline = mDienstlinie
    20. Dienstkurs = mDienstkurs
    21. Dienstroute = mDienstroute
    22. Dienstf = mDienstf
    23. End Sub
    24. Public Overrides Function ToString() As String
    25. Dim l = New List(Of String)
    26. For Each info As System.Reflection.PropertyInfo In Me.GetType().GetProperties()
    27. l.Add(info.Name & ": " & info.GetValue(Me).ToString)
    28. Next
    29. Return String.Join(vbNewLine, l)
    30. End Function
    31. End Class


    Wenn ich jetzt auf mein Button in der Form klicke werden im Panel1 die Steuerelemente erstellt siehe hier: (pro klick eine Zeile)



    jetzt will ich die .text oder .Value in als Messagebox anzeigen lassen (als Test)

    VB.NET-Quellcode

    1. MessageBox.Show(DienstZeile(z - 1).ToString)


    z = der Integer also die Zahl der Zeile, in diesen fall 1 für Zeile 1 -1 für 0.toString zum anzeigen

    In der Deklaration habe ich dann Private DienstZeile As New List(Of Dienste)

    Um die Daten überhaupt in die Property Klasse zu speichern habe ich

    DienstZeile.Add(New Dienste(Lbl.Text, Dtp.Value, Comb.SelectedItem, Dtp1.Value, Comb1.SelectedItem, Comb2.SelectedItem, Nud.Value, Nud1.Value, Check.Checked))

    nur leider zeigt er mir keine Daten an .... :(
    Na, irgendwas wird er schon in der MessageBox anzeigen, oder? Nur vermute ich mal: eben genau die Werte, die während der DienstZeilenerstellung (DienstZeile.Add(...)) eben aktuell in den einzelnen CEs drinstand. Dass da bei dem Konstrukt niemals die aktuellen Werte drinstehen können, (also wenn nach Erstellung der Dienstzeile der Wert z.B. vom 1. DTP geändert wird) und man dann Dienstzeile(x).ToString aufruft, ist Dir hoffentlich klar.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ja das war mir klar deshalb der aufruf z - 1 um die erstellen Integer aufzurufen (oder zu speichern)

    ABER !!! jetzt hab ich es hinbekommen mit Directcast

    VB.NET-Quellcode

    1. DienstZeile.Add(New Dienste(DirectCast(Panel1.Controls("Label_" & i), Label).Text, DirectCast(Panel1.Controls("DatetimePicker_" & i), DateTimePicker).Value, '...... etc


    Vielen Dank erstmal für alle gedankenanstöße ^^