Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1549 | Anzahl registrierter User: 1833 | Besucher online: 581
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

DelayedEventHandler


Autor: Dominik Wagner
Sprache: C#
Bewertung:
5.44 (2 votes)
Anzahl der Aufrufe: 3777
  
Kick it on dotnet-kicks.de  

Beschreibung:

Hilfklasse, um auf Ereignisse zeitverzögert reagieren zu können. Vergleichbar mit einer Entprellung von elektrischen Signalen.

Beispiel anhand dem SelectedIndexChanged Ereignisses einer Combobox:

this.cmb_Test = new ComboBox();
this.cmb_Test.SelectedIndexChanged += new DelayedEventHandler(5000, new EventHandler(this.egC_GlassCombobox1_SelectedIndexChanged)).OnDelay;


Abgelegt unter: delay, event, event handling, events, invoke, timer, helper.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/// <summary>
/// Helper class to call a function delayed
/// </summary>
public class DelayedEventHandler
{
        /// <summary>
        /// Delay-Timer
        /// </summary>
        private Timer t_Delay = new Timer();

        /// <summary>
        /// Delegate that should be invoked  after delay
        /// </summary>
        private EventHandler eventDelegate;

        /// <summary>
        /// Delegate that receive the outer event to start delay
        /// </summary>
        public EventHandler OnDelay;

        /// <summary>
        /// The sender which raised the outer event
        /// </summary>
        private object sender;

        /// <summary>
        /// The event args that comes from the outer event
        /// </summary>
        private EventArgs e;

        /// <summary>
        /// Inits the delayed eventhandler
        /// </summary>
        /// <param name="delay">the time to wait before event is raised in ms</param>
        /// <param name="eventDelegate">the delegate that should be invoked after delay</param>
        public DelayedEventHandler(int delay, EventHandler eventDelegate)
        {

            t_Delay.Interval = delay;
            t_Delay.Tick += new EventHandler(t_Delay_Tick);
            
            this.eventDelegate = eventDelegate;

            //bind delegate to register function, that start delay timer
            this.OnDelay = new EventHandler(this.Register);
        }


        /// <summary>
        /// The time to wait before event is raised in ms
        /// </summary>
        public int Delay
        {
            get { return this.t_Delay.Interval; }
            set { this.t_Delay.Interval = value; }
        }


        private bool stopAndRestart = true;

        /// <summary>
        /// Controls the delay behaviour
        /// </summary>
        public bool StopAndRestart
        {
            get { return stopAndRestart; }
            set { stopAndRestart = value; }
        }
   


        /// <summary>
        /// method invoked after delay
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void t_Delay_Tick(object sender, EventArgs e)
        {
            //stop timer
            this.t_Delay.Stop();

            //invoke outer function by delegate with right sender and eventargs
            if (this.eventDelegate != null)
                this.eventDelegate(this.sender, this.e);
        }

        /// <summary>
        /// invoked when outer event is raised
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Register(object sender, EventArgs e)
        {
            this.sender = sender;
            this.e = e;

            if (this.StopAndRestart)
            {
                //stop and restart timer
                this.t_Delay.Stop();
            }

            this.t_Delay.Start();
        }
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Rainer Hilmer schrieb am:  11.08.2010 09:41:03

Ich verstehe den Sinn dieses Snippets nicht. Wer möchte nach Auswahl eines Items aus einer ComboBox 5 Sekunden warten bis etwas passiert?
Ausserdem: ich bin kein Elektriker. Was versteht man unter "Entprellung von elektrischen Signalen"?
Thomas Freudenberg schrieb am:  11.08.2010 09:47:39

"Prellen" hast Du manchmal bei Schaltern, wenn der Kontakt nicht sofort schließt, sondern, nun, prellt. Schau einfach mal bei Wikipedia: http://de.wikipedia.org/wiki/Prellen

Das hier vorgestellte DelayedEvent hilft Dir zum Beispiel bei einer Suchmaske. Während Du den Suchbegriff eingibst, läuft schon mal die Suche los. Aber wenn Du schnell tippst, soll nicht nach jedem Zeichen sofort losgesucht werden, sondern erst, wenn Du für eine Sekunde keine Taste mehr gedrückt hast.
Dominik Wagner schrieb am:  11.08.2010 09:52:50

Das Beispiel für den Einsatz ist vielleicht etwas unpassend... das gebe ich zu ;-)

ein realistischeres Beispiel hat Thomas bereits erwähnt...

ein weiteres wäre bspw. wenn du auf ein Resize-Ereignis andere Berechnungen durchführen musst -> dies würde ja ohne "Verzögerung" sehr oft passieren...

ich programmiere auch viele Oberflächen für Touchpanels im Automatisierungssektor -> habe es auch schon erlebt, dass der Touch mehrere Click-Events auslöst wenn der Anwender länger auf dem Button drauf bleibt...

ich hoffe jetzt ist der Sinn des Snippets etwas verständlicher
Jan Welker schrieb am:  11.08.2010 09:58:10

Zu diesem Thema ist der Event-Filter Snippet von Roland Weigelt einen Blick wert: http://dotnet-snippets.de/dns/eventfilter-SID743.aspx
Dort gibt es auch eine ausführliche Erklärung zum Thema.
Dominik Wagner schrieb am:  11.08.2010 10:19:47

Danke für den Hinweis! Hmm wenn ich's früher gewusst hätte, hätte ich mir die Arbeit sparen können...

mein Anliegen war aber auch eine sehr einfache Verwendung (am besten in einer Zeile verwendbar) -> eine generische Klasse für generische Events kann gerne auch noch posten...
Dominik Wagner schrieb am:  24.08.2010 14:41:50

würde sich über eine bewertung freuen ;-)


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.