Wie Listviewitem ändern beim Event AfterLabelEdit wg. Wertüberprüfung?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Achilleus.

    Wie Listviewitem ändern beim Event AfterLabelEdit wg. Wertüberprüfung?

    Hallo Leute,

    irgendwie stehe ich auf dem Schlauch. ?(

    Ich möchte in einem Listview beim Event AfterLabelEdit ggf. den eingegebenen Wert ändern.

    Hier mein Lösungsansatz:

    VB.NET-Quellcode

    1. Private Sub lvwMailversand_AfterLabelEdit(sender As Object, e As LabelEditEventArgs) Handles lvwMailversand.AfterLabelEdit
    2. If IsDate(e.Label.ToString) Then
    3. With lvwMailversand.FocusedItem
    4. .Text = Convert.ToDateTime(e.Label.ToString)
    5. End With
    6. Edit_VersanddatumMenuStripItem.PerformClick()
    7. Else
    8. e.CancelEdit = True
    9. MessageBox.Show("Geben Sie bitte ein gültiges Datum ein.", "Fehler bei Datumseingabe", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    10. End If
    11. End Sub



    Ich möchte im Listview ein Datum eingeben, dabei soll der Anwender aber möglichst einfach die Werte ändern können.
    Beispieleingaben: 15,10,22 / 15/10/22 / 15.10.22 => soll nach Änderung geändert werden in 15.10.2022

    Ich bekomme das aber einfach nicht hin.
    Hat einer eine Idee was ich hier falsch oder anders machen kann?

    Vielen Dank im Voraus.

    Gruß Achilleus
    Uah. ListView zur Datenbearbeitung, obwohl das ein Fall für das DGV ist. Nuja. Funktioniert denn Dein Lösungsansatz bisher?
    IsDate klingt nach VB6-Namespace.
    e.Label ist bereits ein String, der muss nicht mit ToString dazu gemacht werden.
    IsDate wird wohl für 15,10,22 scheitern. Schreib Dir eine Funktion namens z.B. GetValidDateTextFrom, die den Text entgegennimmt und damit ein Datum ermittelt und dieses zurückgibt. Dann reicht (vielleicht):

    VB.NET-Quellcode

    1. Dim DateText = GetValidDateTextFrom(e.Label)
    2. If Not String.IsNullOrEmpty(DateText) Then
    3. lvwMailversand.FocusedItem.Text = DateText
    4. Edit_VersanddatumMenuStripItem.PerformClick() 'ich mag diese PerformClick-Zeilen einfach nicht
    5. Else
    6. e.CancelEdit = True
    7. MessageBox.Show("Geben Sie bitte ein gültiges Datum ein.", "Fehler bei Datumseingabe", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    8. End If

    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.
    Hier noch einmal VBNet-Konform: :P

    VB.NET-Quellcode

    1. If e.Label = Nothing Then Exit Sub
    2. Try
    3. DateTime.TryParse(e.Label, Convert.ToDateTime(e.Label))
    4. With lvwMailversand.FocusedItem
    5. .Text = Convert.ToDateTime(e.Label)
    6. End With
    7. Dim strSQL As String = "Update tblVersand set tblVersand.Versanddatum = ? WHERE (((tblVersand.ID)=" & lvwMailversand.SelectedItems(0).Tag & "));"
    8. Dim cmd = New OleDbCommand(strSQL, oledb_Notizen)
    9. 140: With cmd.Parameters
    10. 150: .Add("@Versanddatum", OleDbType.Date).Value = Convert.ToDateTime(lvwMailversand.FocusedItem.Text)
    11. 160: End With
    12. cmd.ExecuteNonQuery()
    13. Call LoadTaskliste(AtomTables.Versand)
    14. Call LoadVersanddaten(_GetTaskID)
    15. DGVTask.Select()
    16. DGVTask.CurrentCell = DGVTask(DGVTask.CurrentCell.ColumnIndex, DGVTask.CurrentCell.RowIndex)
    17. Catch
    18. e.CancelEdit = True
    19. MessageBox.Show("Geben Sie bitte ein gültiges Datum ein.", "Fehler bei Datumseingabe", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    20. End Try


    Das Ergebnis ist aber das gleich. ;(



    Wie man sehen kann, werden die Kommata nicht geändert. Wie bekomme ich das geändert?

    Gruß Achilleus
    Call? Zeilennummern (verwendest Du etwa Goto?!?)?
    Da Du Deinen Rohtext immer noch nicht selbständig in einen Date-Parser-kompatiblen Text umwandelst, bist Du keinen Schritt weiter. Ich glaube kaum, dass irgendeine Framework-Funktion eine Eingabe wie 15,10,22 in ein Datum umwandeln kann. Das musst Du schon selber machen.
    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.

    VaporiZed schrieb:

    Call? Zeilennummern (verwendest Du etwa Goto?!?)?


    Nein, ich habe die MZTools und hiermit füge ich die Zeilennummern ein, die ich für Fehlermeldungen abfrage.

    Ich habe jetzt folgendes festgestellt. Anscheinende kann man nach einem LabelAfterEvent den Wert nicht noch nachträglich ändern. Ich muss mir also eine andere Lösung einfallen lassen.

    Gruß Achilleus
    Ah, Du hast anscheinend (etwas spät leider erst) mitbekommen, dass das gar nicht so funktioniert, weil vermutlich der Code

    VB.NET-Quellcode

    1. lvwMailversand.FocusedItem.Text = "irgendwas"
    in dem EventHandler gar keine Wirkung zeigt. Zuviel gecodet, ohne es zu testen.
    Aber es gibt Abhilfe: mein bei mir beliebter Delay-Workaround:

    VB.NET-Quellcode

    1. Private Async Sub ListView1_AfterLabelEdit(sender As Object, e As LabelEditEventArgs) Handles ListView1.AfterLabelEdit
    2. If AllesIstInOrdnung Then
    3. Await Threading.Tasks.Task.Delay(1)
    4. ListView1.FocusedItem.Text = "DerNeueText"
    5. Else
    6. e.CancelEdit = True
    7. End If
    8. End Sub
    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.
    Hallo VaporiZed,

    das war genau die Lösung.

    Hier nun mein endgültiger Code:

    VB.NET-Quellcode

    1. Private Async Sub lvwMailversand_AfterLabelEdit(sender As Object, e As LabelEditEventArgs) Handles lvwMailversand.AfterLabelEdit
    2. If e.Label = Nothing Then Exit Sub
    3. If DateTime.TryParse(e.Label, Convert.ToDateTime(e.Label)) Then
    4. Dim strSQL As String = "Update tblVersand set tblVersand.Versanddatum = ? WHERE (((tblVersand.ID)=" & lvwMailversand.SelectedItems(0).Tag & "));"
    5. Dim cmd = New OleDbCommand(strSQL, oledb_Notizen)
    6. With cmd.Parameters
    7. .Add("@Versanddatum", OleDbType.Date).Value = Convert.ToDateTime(e.Label)
    8. End With
    9. cmd.ExecuteNonQuery()
    10. Call LoadTaskliste(AtomTables.Versand)
    11. Await Threading.Tasks.Task.Delay(1)
    12. lvwMailversand.FocusedItem.Text = Convert.ToDateTime(e.Label)
    13. DGVTask.Select()
    14. DGVTask.CurrentCell = DGVTask(DGVTask.CurrentCell.ColumnIndex, DGVTask.CurrentCell.RowIndex)
    15. Else
    16. e.CancelEdit = True
    17. MessageBox.Show("Geben Sie bitte ein gültiges Datum ein.", "Fehler bei Datumseingabe", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    18. End If
    19. End Sub


    Gruß Achilleus