Aktion ausführen wenn neuer Listbox eintrag vorhanden ist

  • VB.NET
  • .NET (FX) 4.0

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

    Aktion ausführen wenn neuer Listbox eintrag vorhanden ist

    Ich habe eine Webseiten Anwendung für Mysql geschrieben mit @whitetiiger .
    nun hab ich einen Timer erstellt der alle 20sec nach einem neuen Eintrag schaut.
    ich möchte das wenn ein neuer Eintrag erscheint eine Aktion ausgeführt wird.

    weiß Jemand wie ich das am besten anstelle?!

    Danke im vorraus?! :thumbsup:

    Wenns kein Event hierfür gibt, im Timer die Anzahl der Items ermitteln und mit dem vorherigen Ergebnis vergleichen. Oder, da du ja das Item irgendwie aktiv einfügst, deine Aktion dort direkt ausführen lassen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    xX-Nick-Xx schrieb:

    wenn ein neuer Listbox eintrag da ist..


    ​Wer fügt denn die Items in die ListBox ein?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Und damit geht es nicht?

    mrMo schrieb:

    (...) im Timer die Anzahl der Items ermitteln und mit dem vorherigen Ergebnis vergleichen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Oder eben - um den Post von mrMo zu konkretisieren - passende Events kreieren. Ich hab mal späßleshalber ne extended ListBox gebastelt. Das Prinzip ist den meisten hier zwar nicht fremd, die passende Anregung (und die verwendeten Konstanten) fand ich aber bei diesem stackoverflow-thread. Damit kann man statt ner normalen ListBox diese hier nehmen und hat ein ContentChanged-Event, was bei Items hinzufügen (Add, Insert), löschen (Remove in all seinen Varianten) und alles leeren (Clear) anspringt.
    Und für die, die damit noch nix anfangen können: Einfach im gewünschten Projekt ne neue Klasse anlegen, vorhandenen Code (die zwei Zeilen Klassenrumpf) rauslöschen, unten stehenden Code reinkopieren, compilieren und dann erscheint das neue Steuerelement in der Toolbox. In die Zielform reinsetzen, Doppelklick drauf und es öffnet sich automatisch das ContentChanged-Event, in das man dann reinschreiben kann, was bei den o.g. Vorfällen passieren soll.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <ToolboxItem(True),
    3. Description("a ListBox which recognizes content changes"),
    4. DefaultEvent("ContentChanged")>
    5. Public Class ListBoxEx : Inherits ListBox
    6. Private Const LB_ADDSTRING = &H180
    7. Private Const LB_INSERTSTRING = &H181
    8. Private Const LB_DELETESTRING = &H182
    9. Private Const LB_RESETCONTENT = &H184
    10. Public Event ContentChanged(sender As Object, e As EventArgs)
    11. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    12. If m.Msg = LB_ADDSTRING OrElse m.Msg = LB_DELETESTRING OrElse m.Msg = LB_INSERTSTRING OrElse m.Msg = LB_RESETCONTENT Then
    13. RaiseEvent ContentChanged(Me, EventArgs.Empty)
    14. End If
    15. MyBase.WndProc(m)
    16. End Sub
    17. End Class


    EDIT: Das ganze ließe sich zwar in nem erweiterten EventArgs-Parameter insofern noch weiter aufschlüsseln, dass man sehen kann, was sich genau verändert hat, aber dem TE reichen ja allgemein inhaltliche Veränderungen in der ListBox.
    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 Coole Lösung, hatte ich auch im Hinterkopf. :) Find "eigene" Controls sehr praktisch, jedoch in diesem Fall für die einmalige Nutzung in diesem Anwendungsfall nen bissl over sized
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Puh, wie soll ich es noch anders formulieren als meine Beschreibung es schon getan hat? Der Code erstellt eben eine erweiterte ListBox. Wenn Du Deine ListBox, in der Deine Datenbankeinträge ankommen, löschst und dafür die oben codierte ListBoxEx in Deine Anwendung einbaust, erhälst Du ein zusätzliches Event namens ContentChanged. Und das wird immer dann ausgelöst, wenn mindestens ein ListBox-Item, also ein Eintrag aus Deiner Datenbank in die ListBox geschrieben wurde und auch dann, wenn mindestens eins gelöscht wurde. Wenn Du die ListBoxEx in Deine Anwendung einbaust und ein Doppelklick drauf machst, kommst Du beim EventHandler dieses Events raus. Das ist, als ob Du nen Button in Deine Anwendung setzt und nen Doppelklick drauf machst, dann kommst Du beim EventHandler des Click_Events raus. Du kannst in den EventHandler also reinschreiben, was passieren soll, wenn das entsprechende Event auftritt (beim Button: was passiert, wenn man den Button klickt; bei der ListBoxEx: was passiert, wenn ListBox-Einträge dazukommen oder verschwinden).

    Das war doch das Verhalten, was Du wolltest, richtig?
    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.

    xX-Nick-Xx schrieb:

    Die Mysql Tabelle hat eine ID einfach nur beim Beenden die Größte zahl speichern und beim laden schauen ob es eine Größere gibt


    Beim Beenden und Laden? Nun, wenn Dir Deine Idee wirklich weiterhilft, ok. Durch die Eingangspost wurde der Eindruck ermittelt, dass die Überprüfung im laufenden Betrieb von MySQL und VB.Net-Anwendung passieren soll. Sonst hättest Du ja auch nicht geschrieben, dass Du erstmal einen Timer dafür verwendet hast. :huh:
    Memo an mich: Nachbohren, bis man alle relevanten Infos vom TE hab.
    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.

    xX-Nick-Xx schrieb:

    Die Mysql Tabelle hat eine ID einfach nur beim Beenden die Größte zahl speichern und beim laden schauen ob es eine Größere gibt :)


    Hä, ich dachte da kommen zur Laufzeit regelmäßig neue Einträge rein und evtl. werden alte Einträge entfernt und dass du dann hier drauf reagieren möchtest. Wozu brauchst du dann den Timer? Was machst du, wenn ein Eintrag neu rein kommt der eine kleinere ID hat wie die, die du gespeichert hast?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Jo, da ist prinzipiell doch möglich, die Abfrage so zu gestalten, dass sie nur die Datensätze abruft, deren ID höher ist als die höchste ID, die du bislang hast.
    So kriegst du auch mit, wenn zw. 2 Ticks mal mehrere neue Datensätze hinzukommen.

    Ich hoffe nur, dass nicht vorgesehen ist, Datensätze auch mal zu ändern, oder gar zu löschen.