fortgeschrittene Änderung an TextBoxen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von hirnwunde.

    tb_lw ist eine Textbox (tb), die einen Messwert "längs" aufnimmt. Mit unserem Kunden wird der Wert als "lengthwise"(lw) kommuniziert.

    Aber ich habe verstanden, auf was Du hinaus willst und werde mich darum bemühen sinnfollere Bezeichner zu wählen.

    hirnwunde schrieb:

    auf was Du hinaus willst

    ErfinderDesRades schrieb:

    und Code würde sich malwieder selbst erklären
    Code lesen und verstehen.
    Wenig aber gute Kommentare, ein Verfolgen von Aufrufen sollte für den "geneigten Leser" nicht unbedingt erforderlich sein.
    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!

    hirnwunde schrieb:

    Mit unserem Kunden wird der Wert als "lengthwise"(lw) kommuniziert.
    Jo - das sind beim Benamen die entscheidenden Informationen. Nicht ob es eine Textbox ist, oder ein KeyDown, sondern das Event zeigt an, das ein Lengtwise-Input abgeschlossen wurde.
    Beim bedeutungsvollem Benamen ist v.a. ausschlaggebend, was etwas bedeutet, nicht wie es konkret programmiert wurde.
    Daher heißt dein Event LengtwiseInputDone - und es ist vom Prinzip her schnuppe, ob die Eingabe per Tasten in eine Textbox erfolgte, oder per Mausklick auf mw. eine Combo oder WhatEver.

    Man stiert immer auf Buttons, Labels, Textboxen, Datagridviews und whatever, und verliert völlig aus den Augen, was man damit eiglich erreichen will.
    Und dass alle diese dolle Controls nur Mittlel zum Zweck sind, und ebensogut wären andere Mittel denkbar, für denselben Zweck.
    @ErfinderDesRades & @RodFromGermany

    Euch beiden schonmal herzlichen Dank für eure Hinweise und Code-Stückchen!
    Ich werde das in zukünftigen Projekten zu Herzen nehmen und ersuchen, es in den jetzigen und vorhergehenden anzupassen.

    Ich bin mit dem Projekt (auf Basis von Rod's TestMyUserControl) so weit, das man es fast nutzen kann ;)
    Mit einer Sache habe ich aber noch ein Problem.

    Nach dem anzeigen der Form werden ja die ganzen UserControls in das FlowControl hinzugefügt:

    VB.NET-Quellcode

    1. Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    2. For i = 0 To lastUC
    3. Dim uc = New MyUserControl
    4. uc.Index = i
    5. AddHandler uc.CutButtonClicked, AddressOf CutButtonClickHandler
    6. AddHandler uc.LengthwiseInputDone, AddressOf LwInputDoneHandler
    7. AddHandler uc.CrosswiseInputDone, AddressOf CwInputDoneHandler
    8. AddHandler uc.endCheckboxChecked, AddressOf EndCheckboxClicked
    9. AddHandler uc.GetRowInfo, AddressOf RowInfoButtonClickHandler
    10. Me.MyUserControls.Add(uc)
    11. Me.FlowLayoutPanel1.Controls.Add(uc)
    12. Next
    13. End Sub


    Nun habe ich mit dem Button btn_cut_row, der das Event CutButtonClicked schiesst, dem Nutzer die Möglichkeit gegeben, eine Reihe aus diesem FlowControl zu löschen.

    VB.NET-Quellcode

    1. Private Sub CutButtonClickHandler(sender As Object, e As EventArgs)
    2. Dim uc As MyUserControl = DirectCast(sender, MyUserControl)
    3. Me.FlowLayoutPanel1.Controls.Remove(MyUserControls(uc.Index))
    4. MessageBox.Show("Removed " + uc.ToString)
    5. AddMyControlsRow(1)
    6. End Sub

    Die Methode AddMyControlsRow() fügt anschliessend wieder eine Reihe hinzu, sodass immer 20 Controls in dem FlowControl verbleiben.

    VB.NET-Quellcode

    1. Private Sub AddMyControlsRow(ByVal cnt As Integer)
    2. Dim lastidx As Integer = MyUserControls.Count
    3. For i = 1 To cnt
    4. Dim uc = New MyUserControl
    5. uc.Index = lastidx
    6. AddHandler uc.CutButtonClicked, AddressOf CutButtonClickHandler
    7. AddHandler uc.LengthwiseInputDone, AddressOf LwInputDoneHandler
    8. AddHandler uc.CrosswiseInputDone, AddressOf CwInputDoneHandler
    9. AddHandler uc.endCheckboxChecked, AddressOf EndCheckboxClicked
    10. AddHandler uc.GetRowInfo, AddressOf RowInfoButtonClickHandler
    11. Me.MyUserControls.Add(uc)
    12. Me.FlowLayoutPanel1.Controls.Add(uc)
    13. Next
    14. End Sub

    [Randbemerkung]Beim schreiben faellt mir auf, dass ich ja im Form.Show-Event ja auch die Funktion aufrufen kann ...[/Randbemerkung]

    Aber ich glaube, das Löschen des Controls aus dem FlowControl falsch an zu gehen.
    Denn ... ich lösche es zwar aus dem FlowControl aber in der Liste MyUserControls (welche im Module definiert ist: Private MyUserControls As New List(Of MyUserControl)) ist das Element noch immer vorhanden.
    Aber um dieses auch aus der Liste zu Löschen, benötige ich einen eindeutigen Namen.
    Aber eben dieses finde ich nirgens.

    Ich ahb es bisher folgendermassen versucht:

    VB.NET-Quellcode

    1. Private Sub RowInfoButtonClickHandler(sender As Object, e As EventArgs)
    2. Dim uc As MyUserControl = DirectCast(sender, MyUserControl)
    3. Dim MyIndex As Integer = uc.Index
    4. Dim controlname As String = uc.Name
    5. Dim sendername As String = sender.ToString
    6. MessageBox.Show("MyIndex: " + MyIndex.ToString + CrLf + "ControlName = " + controlname + CrLf + "Sender: " + sendername)
    7. End Sub

    ControlName bleibt immer MyUserControl
    sendername bleibt immer WindowsApplication1.MyUserControl
    Einzig MyIndex aendert sich.
    Aber ein Element aus der Liste mit dessen Index zu löschen, habe ich nicht gefunden.
    .Remove erwartet ja einen String ...

    Mein Problem liegt jetzt hier:
    Ich lösche zwar das Element aus dem FlowControl, aber eben nicht aus der Liste.
    Die Liste läuft immer weiter voll, während das FlowControl immer nur 20 Elemente beinhaltet.

    Wenn ich jetzt Reihe 4 in dem FlowControl lösche, rutsch alles untere nach oben (was es ja auch soll) aber behält seinen Index aus der Liste.
    Somit entsteht eine Lücke zwischen der Reihe 3 und der neuen Reihe 4 (welche ja vorher Reihe 5 war)

    hirnwunde schrieb:

    aber eben nicht aus der Liste.

    Äquivalent zu

    hirnwunde schrieb:

    VB.NET-Quellcode

    1. Me.MyUserControls.Add(uc)
    2. Me.FlowLayoutPanel1.Controls.Add(uc)
    musst Du es aus beiden Collections löschen.
    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!
    mal so nebenbei: Bist du dir immer noch sicher, Zeit zu sparen, indem du mit diesen UserControls rumwerkelst?
    Hättest du dich in derselben Zeit nicht besser in die gegebenen Standard-Technologien der Datenverarbeitung einarbeiten können?

    Naja, vlt. auch nicht, ich will nix versprochen haben, was dann nicht gehalten hätte, aber es zieht sich doch auch, odr? :evil:

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

    Ich bin mir ziemlich sicher, dass ein typisierter Datensatz + DGV hier schon angebracht wäre. Mit den Tutorials vom Erfinder hättest du dich
    da auch ziemlich schnell eingelesen. Kann die nur empfehlen!

    Ich verstehe immernoch nicht was du DB nennst. Von Sql und typisierten Datasets usw war ja nicht die Rede. Schreibst du alles per Klartext in eine Datei!?
    Das ist dann meiner Meinung nach keine Datenbank.

    MfG Tim

    hirnwunde schrieb:

    anstellen
    tust Du das so:

    VB.NET-Quellcode

    1. Private nummer As Integer = 0
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim btn = New Button
    4. btn.Name = "btn" & nummer
    5. btn.Text = "btn" & nummer
    6. nummer += 1
    7. Me.FlowLayoutPanel1.Controls.Add(btn)
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. If Me.FlowLayoutPanel1.Controls.Count > 0 Then
    11. Me.FlowLayoutPanel1.Controls.RemoveAt(0)
    12. End If
    13. End Sub
    Sieh Dir noch die anderen RemoveXX()-Prozeduren an.
    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!

    ErfinderDesRades schrieb:

    Hättest du dich in derselben Zeit nicht besser in die gegebenen Standard-Technologien der Datenverarbeitung einarbeiten können?


    Das mag aus der Deiner Sicht sicher der Fall sein.
    Aber bei mir hapert es eben noch an Grundkenntnissen der verschiedensten Art.
    Und diese muss ich dann halt auch noch erlernen.
    Ich wusste ja nicht mal, wie ich ein typisiertes Dataset erstelle. Als ich dieses machen wollte, brauchte er ja ein schon vorhandenes Dataset.

    Ja, ich werde mir dieses auf jeden Fall mal zu Gemühte ziehen.
    Jetzt bin ich mit dem Ding aber fast fertig (bis auf das löschen der Controls und der verbleibenden Lücke in der Liste)

    Fortender schrieb:

    Schreibst du alles per Klartext in eine Datei!?


    Nein.
    Das wandert alles in eine MySQL-DB.
    Die Logik dessen ist auch schon fertig.