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
 
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:
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.
 
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:
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 :)
 
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.
 
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.
 
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:
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:
Zurück