DataGridView Cell Text Change event

  • VB.NET

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

    DataGridView Cell Text Change event

    Hallo an alle,

    ich habe folgende Herausforderung und bekomme sie aktuell nicht gelöst und hoffe Ihr könnt mir hier ein wenig weiterhelfen.

    Folgendes möchte ich durchführen:

    Ein DataGridView Table wird mit Inhalt gefüllt und besteht z. B. aus zwei Spalten und einer Zeile (um es hier einfach zu machen)
    Erster Inhalt ist eine Zahl für den Wert einer Längenangabe = 10
    Zweiter Inhalt ist Beispieltext, der jetzt nur ca. 8 Zeichen lang ist

    Ein Text Feld ist mit auf dem Formular und soll die aktuelle Textlänge vom zweiten DGV „Zweiter Inhalt“ anzeigen.

    Ich möchte jetzt die Textlänge bei der Eingabe im DGV permanent beim schreiben auslesen (im Textfeld ändern) und überwachen (wenn Textlänge aus Zelle 2 <> Wert aus Zelle 1, dann Cell Back Color = red

    Ich setzte aktuell den Event „DataGridView1_EditingControlShowing“ ein und der funktioniert auch schon, nur immer eine Eingabe zu spät und die Len() Angabe ist somit nicht korrekt.

    Wo liegt mein Fehler?
    Danke für Eure Hilfe... :)


    Hier mein aktueller Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. With DataGridView1
    3. .AllowUserToAddRows = False ' User kann keine Zeilen hinzuf.
    4. .RowHeadersVisible = False ' Überheader ausblenden
    5. .ColumnHeadersVisible = True
    6. .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
    7. .Columns.Clear()
    8. .Columns.Add("Spalte1", "Len")
    9. .Columns.Add("Spalte2", "Field")
    10. End With
    11. Dim vRow As String() = New String() {"10", "Hier ist"}
    12. DataGridView1.Rows.Add(vRow)
    13. DataGridView1.Show()
    14. DataGridView1.CurrentCell = Nothing
    15. End Sub


    VB.NET-Quellcode

    1. Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. If DataGridView1.CurrentCell.ColumnIndex = 1 And Not e.Control Is Nothing Then
    3. Dim tb As TextBox = CType(e.Control, TextBox)
    4. Label_len.Text = Len(tb.Text)
    5. AddHandler tb.KeyDown, AddressOf TextBox_KeyDown
    6. End If
    7. End Sub


    VB.NET-Quellcode

    1. Private Sub TextBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    2. Dim tb As String = sender.Text
    3. Label_len.Text = Len(tb)
    4. If DataGridView1.Item(0, DataGridView1.CurrentRow.Index).Value = Len(tb) Then
    5. DataGridView1.Rows(DataGridView1.CurrentRow.Index).DefaultCellStyle.BackColor = Color.White
    6. Else
    7. DataGridView1.Rows(DataGridView1.CurrentRow.Index).DefaultCellStyle.BackColor = Color.Red
    8. End If
    9. End Sub
    Willkommen im Forum. :thumbup:

    Bernd100 schrieb:

    Wo liegt mein Fehler?
    Pack zuerst den Coe aus der Form_Load raus in eine Button_Click, weil die Form_Load verschluckt viele WExceptions und Du merkst nix davon.
    Was passiert dann in der Button_Click?
    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!
    Hallo ErfinderDesRades,

    das war genau die richtige Antwort und Hinweis....
    Es funktioniert genau so wie es sein soll.

    Geändert habe ich nur den Key Event und für alle anderen noch mal den Code.

    VB.NET-Quellcode

    1. Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. If DataGridView1.CurrentCell.ColumnIndex = 1 And Not e.Control Is Nothing Then
    3. Dim tb As TextBox = CType(e.Control, TextBox)
    4. Label_len.Text = Len(tb.Text)
    5. '**** alter eintrag, immer ein Eingabezeichen zu spät.. "tb.KeyDown"
    6. 'AddHandler tb.KeyDown, AddressOf TextBox_KeyDown
    7. '**** "tb.KeyDown" geändert in "tb.KeyUp" und ist zur Laufzeit genau richtig
    8. AddHandler tb.KeyUp, AddressOf TextBox_KeyDown
    9. End If
    10. End Sub


    Danke und Gruß