Eigene Eventhandler ....


Speedkill

Erfahrenes Mitglied
Hallo Leute ich hoffe ihr könnt mir helfen.

Ich bin zu blöd um das mit den Eventhandler auf die Reihe zu kriegen.
Ich suche jetzt schon über 1 Std. im Netz und in einem msc..Klugerbuch aber ich kapiers einfach ned.

Mein Problem ist eigentlich garnich so schwer aber naja, also es geht darum :

Ich habe eine Form (Form1) die hat ein Label und erzeugt eine Instanz einer anderen Klasse (IISConfig).
Über die Instanz werden einige Methoden in IISConfig aufgerufen und nun sollen diese Methoden jeweils ein Event auslösen welches in meiner Form1 eine Methode aufruft z.B. Changelbl().

Also ich bin bis jetzt soweit daß ich in IISConfig folgendes habe: einen Eventhandler und ein event.
Code:
public delegate void ChangeTextEventHandler(object sender,string textToAdd);
 
public event ChangeTextEventHandler ChangeLabel;

auslösen tue ich das event so :

Code:
ChangeLabel(this, "Virtuelles Verzeichnis " + name + " erstellt.");

Die Methode die dann in Form1 ausgeführt werden soll habe ich auch:

Code:
public void lblChange(string newText) {
 
this.lblOUT.Text += "\n" + newText;
 
this.lblOUT.Refresh();
 
}

So nun komme ich aber nicht weiter wie ich nun in Form1 das Event abfange und auf diesen Code leite.

Ich hoffe Iht könnt mir helfen, ich glaube ich habe mich solange auf das Zeug konzentriert daß ich nun garnix mehr blicke.

Grüße
Speedy
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo SpeeKill!

Soweit hast ja erst mal alles.
Du musst jetzt nur noch das Event deiner Klasse IISConfig abonieren.

Aber als aller erstes, solltest Du dir eine eine Klasse implementieren,
die von EventArgs erbt und den "textToAdd" bereit hält.
Code:
public class ChangeTextEventArgs : EventArgs {
		
	string readonly _TextToAdd;

	public string TextToAdd {
		get { return _TextToAdd; }
	}

	public ChangeTextEventArgs( string textToAdd ) {
		_TextToAdd = TextToAdd;
	}
}
public delegate void ChangeTextEventHandler(object sender, ChangeTextEventArgs e);
Danach einfach nur das Event im Form Abonieren:
Code:
"IISConfigInstanzName".ChangeLabel += new MyNamespace.IISConfig.ChangeTextEventHandler( lblChange );
Ich würde die Methode aber lieber so nennen:
Code:
"IISConfigInstanzName".ChangeLabel += new MyNamespace.IISConfig.ChangeTextEventHandler( "IISConfigInstanzName"_ChangeLabel );
Dann solltest alles haben. :)
Wenn Du noch Fragen hast, frag einfach.

MfG, cosmo
 
Zuletzt bearbeitet:

Speedkill

Erfahrenes Mitglied
Danke erstmal, das klingt wenigstens mal verständlich.
Werde ich gleich morgen früh mal probieren weil für heute raucht mir die Birne zu stark.

Aber ich glaube ich beginne nun zu begreifen ;)

Danke nochmal für die schnelle Antwort.
 

ZeuX

Grünschnabel
Hallo!

Ich versuche nun seit einiger Zeit meinen Eventhandler zum Funktionieren zu bewegen, doch das ganze gestalltet sich schwieriger als erwartet.

Die Situtaion ist folgende,
ich habe eine Klasse(dev) in welcher eine weitere Klasse(comment) definiert ist die einen Eventhandler benötigt der, sobald eine bestimmte Variable geandert wird eine Funktion in der Form auslöst.

mein Problem ist, dass ich keine Ahnung wohin welcher Aufruf gehört.

Zurzeit sieht es in der Klasse so aus:
Code:
namespace namespace
{
    class dev
    {
        public delegate void ChangeCommentEventArgsDeleagte(object sender, ChangeCommentEventArgs e);
        public class ChangeCommentEventArgs : EventArgs
        {
            bool new_comment_var;

            public bool new_comments
            {
                get { return this.new_comment_var; }
            }
            public ChangeCommentEventArgs(bool has_new)
            {
                this.new_comment_var = has_new;
            }
        }

        public class Comments
        {
            public event ChangeCommentEventArgsDeleagte New_Comment;

            private StringCollection c_id = new StringCollection();
            
            private bool has_new = false;

            public void add_new(string d_Comment_Id)
            {
                c_id.Add(d_Comment_Id);
                has_new = true;
                New_Comment(this, new ChangeCommentEventArgs(has_new));
            }
        }
}

Ich wuerde mich wirklich freuen wenn mir jemand weiterhelfen kann!

ZeuX
 
Zuletzt bearbeitet:

Norbert Eder

Erfahrenes Mitglied
Ich würde mich auch freuen, wenn du dich an unsere Netiquette halten würdest und die Groß- und Kleinschreibung gemäß den Regeln anwendest. Dann wird dir sicherlich auch geholfen werden :)
 

ZeuX

Grünschnabel
Entschuldigt, ich war etwas in Eile, wird nicht mehr vorkommen!

Und ich hoffe dass mein Problem nicht allzusehr in die Kategorie "Anfänger" fällt, denn zugegeben, es ist mein erstes größeres C#-Projekt.
 

Norbert Eder

Erfahrenes Mitglied
Der Aufruf gehört an die Stelle wo dann das entsprechende Event gefeuert werden und dann in weiterer Folge auch die gewünschte Aktion erfolgen soll. Wo das genau ist, musst du selbst entscheiden, da nur du weißt wo was passieren soll.
 

Christian Kusmanow

Erfahrenes Mitglied
ZeuX hat gesagt.:
Die Situtaion ist folgende,
ich habe eine Klasse(dev) in welcher eine weitere Klasse(comment) definiert ist die einen Eventhandler benötigt der, sobald eine bestimmte Variable geandert wird eine Funktion in der Form auslöst.

mein Problem ist, dass ich keine Ahnung wohin welcher Aufruf gehört.
Moin ZeuX!

Hast Du dein Problem nun lösen können? Welchen Aufruf meinst denn?
Soweit schaut ja schonmal alles funktionabel aus...
Du könntest noch darauf prüfen
C#:
if ( New_Comment != null )
bevor Du das Event auslöst.
 
Zuletzt bearbeitet:

ZeuX

Grünschnabel
das heißt dass die Klasse dev, so wie sie ist stimmt.

Danach einfach nur das Event im Form Abonieren:
Code:
"IISConfigInstanzName".ChangeLabel += new MyNamespace.IISConfig.ChangeTextEventHandler( lblChange );
Ich würde die Methode aber lieber so nennen:
Code:
"IISConfigInstanzName".ChangeLabel += new MyNamespace.IISConfig.ChangeTextEventHandler( "IISConfigInstanzName"_ChangeLabel );

nur kann ich dann in der Form nach diesem Schema das Event nicht abonieren,
weil sich das Event in einer unter Klasse versteckt(Comments).
Die einzige Möglichkeit die ich sehe wäre diese Unterklasse in der Form ihrerseits nocheinmal zu instanzieren.
Und wenn ich das machen bekomme ich den Laufzeitfehler dass diese "Objektverweis nicht auf eine Objektinstanz festgelegt wurde"....
 
Zuletzt bearbeitet:

Christian Kusmanow

Erfahrenes Mitglied
Ach ich verstehe. Du musst jetzt nur noch eine Instanz deiner Comments Klasse
in deiner Dev Klasse definieren. Danach machst die Comments instanz via Property verfügbar.
Musst aber einen anderen Namen als Comments verwenden.
Danach kannst auf das Event zugreifen.
Also dann so.
C#:
myDev.Comments.New_Comment += myNameSpace.Dev.ChangeCommentEventArgsDeleagte( dev_Comments_New_Comment );
Btw. Man benennt Klassen immer mit einem großen Buchstaben beginnend. ;)
 

ZeuX

Grünschnabel
Ich danke dir!
Es scheint alles so zu funktionieren wie es soll :)

Komischerweise habe ich nur Klassen in Klassen mit Großbuchstaben benannt, werde es ändern, danke :)

ZeuX

ps: es soll ein Programm werden dass Inhalte auf einer Seite besser aufbereitet und zb Meldung gibt wenn ein neuer Kommentar geschrieben wurde. Also ein aufgebohrter Screen Scraper.
 

Christian Kusmanow

Erfahrenes Mitglied
Mann Schreibt aber auch öffentliche Propertynamen groß.
Du machst den Anschein als würdest noch keinen offiziellen Coding Style kennen.
In dem Folgendem Thread findest Infos zu:
[thread=227773]Probleme mit Daten die in entsprechende Klassen unter zubringen ! - Thread[/thread]
Ich hab mal dein Beispiel dementsprechend umbenannt und ein bissel verfeinert. :)
C#:
namespace myNameSpace
{
	using System;
	using System.Collections.Specialized;


	public class Dev
	{
		public class CommentsChangedEventArgs : EventArgs
		{
			readonly bool newComment;
			readonly string comment;

			public bool NewComment {
				get { return this.newComment; }
			}

			public string Comment {
				get { return comment; }
			}


			public CommentsChangedEventArgs( bool newComment, string comment ) {
				this.newComment = newComment;
				this.comment = comment;
			}
		}

		public delegate void CommentAddedEventHandler( object sender, CommentsChangedEventArgs e );

		public class CommentsCollection : StringCollection {
			public event CommentAddedEventHandler CommentAdded;

			bool has_new;

			public CommentsCollection() : base() {
				has_new = false;
			}


			public new void Add( string comment ) {
				base.Add( comment );
				has_new = true;
				if ( CommentAdded != null )
					CommentAdded( this, new CommentsChangedEventArgs( has_new, comment ) );
			}
		}


		CommentsCollection comments;

		public CommentsCollection Comments {
			get { return comments; }
		}

		public Dev() {
			comments = new CommentsCollection();
		}
	}
}
C#:
dev.Comments.CommentAdded += myNameSpace.Dev.CommentAddedEventHandler( dev_Comments_CommentAdded );
 
Zuletzt bearbeitet:

ZeuX

Grünschnabel
Du machst den Anschein als würdest noch keinen offiziellen Coding Style kennen.
Wie gesagt, ich habe noch nichts größeres mit C# programmiert.

In dem Folgendem Thread findest Infos zu:
[thread=22777]Probleme mit Daten die in entsprechende Klassen unter zubringen ! - Thread[/thread]
Der Link den du angegeben hast führt zu einem Thread den du sicher nicht gemeint hast ;)
Hab ihn aber inzwischen schon selber gefunden und werde ihn mir auch sobald ich wieder Zeit habe durchlesen.

Und danke für die Verfeinerung, an einer Klasse die von StringCollections erbt habe ich nicht gedacht...
 
Zuletzt bearbeitet von einem Moderator:

Christian Kusmanow

Erfahrenes Mitglied
ZeuX hat gesagt.:
cosmo hat gesagt.:
Du machst den Anschein als würdest noch keinen offiziellen Coding Style kennen.
Wie gesagt, ich habe noch nichts größeres mit C# programmiert.
Das tut nichts zur Sache. CodingStyles gelten sprachübergreifend. ;)
ZeuX hat gesagt.:
Der Link den du angegeben hast führt zu einem Thread den du sicher nicht gemeint hast ;)
Hab ihn aber inzwischen schon selber gefunden und werde ihn mir auch sobald ich wieder Zeit habe durchlesen.
Jo da hast recht. Hab wohl mit der Threadnummer was falsch gemacht. :-(
Fang aber rechtzeitig an Dir einen offiziellen CodingStyle anzugewöhnen
und Du wirst es zukünftig leichter haben...
 

Shakie

Erfahrenes Mitglied
Warum von EventArgs erben?

Christian Kusmanow hat gesagt.:
Aber als aller erstes, solltest Du dir eine eine Klasse implementieren,
die von EventArgs erbt und den "textToAdd" bereit hält.
Code:
public class ChangeTextEventArgs : EventArgs {
        
    string readonly _TextToAdd;

    public string TextToAdd {
        get { return _TextToAdd; }
    }

    public ChangeTextEventArgs( string textToAdd ) {
        _TextToAdd = TextToAdd;
    }
}
public delegate void ChangeTextEventHandler(object sender, ChangeTextEventArgs e);
Warum sollte die Klasse von EventArgs erben? Was bringt das? Damit alle Events von allen Controls einheitlich strukturiert sind? Wäre nett wenn mich da bitte jemand aufklärt. ;)
 

Christian Kusmanow

Erfahrenes Mitglied
Shakie hat gesagt.:
Warum sollte die Klasse von EventArgs erben? Was bringt das? Damit alle Events von allen Controls einheitlich strukturiert sind?
Ganau so schaut es aus. Und Du könntest dadurch zB auch verschiedene Ereignissobjekte
von einer Methode behandeln lassen. Was auch immer die Verwendung der OOP notwendig bzw möglich macht.
Kannst ja mit dem is Operator herrausfinden von welchem Typ das Objekt ist, welches von EventArgs erbt.
Weiterhin hast dadurch auch die Möglichkeit, ein leeres Ereignissobjekt verwenden zu können (EventArgs.Empty),
welches Du dir sonst selber hättest implementieren müssen.
 

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.626
Mitglieder
187.833
Neuestes Mitglied
SirrDansen