Announcement

Collapse
No announcement yet.

eigene event erstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • eigene event erstellen

    Hallo Zusammen,

    ich habe eine Frage zur Definition eigener Events.
    Ich will ein exception auslösen und in Event behandeln, doch ich verstehe nicht richtig den Konzept villeicht könnte ihr mir bitte weiter helfen:

    1 Programm Main Klasse: Event registrieren
    Code:
     class Program
        {
            static void Main(string[] args)
            {
                // Instantiates the event receiver
                HandleTransferEvents tet = new HandleTransferEvents();
              ......
                tlp.WriteEvent += new TransferEventHandler(tet.OnWrite);
                tlp.ErrorEvent += new TransferEventHandler(tet.OnError);
                Console.WriteLine("Press any key..");
                Console.ReadKey();
            }
    }
        }
    2 Klasse TransferEvent + TransferHandler

    Code:
        public class TransferEventArgs : EventArgs
        {       
            private Exception excep;
            public Exception TransferException
            {
                get { return excep; }
            }
    }
        public class HandleTransferEvents
        {
            public void OnWrite(object sender, TransferEventArgs e)
            {
                Console.WriteLine("Transfer: {0} - Write: {1}:{2}", e.TransferDate, e.TransferName, e.FileName);
            }
    
            public void OnError(object sender, Exception excep)
            {
                ExceptionInformation.DisplayException(excep);
            }
    }
    und dann meine Basesklasse:

    Code:
            public event TransferEventHandler WriteEvent;
            public event TransferEventHandler ErrorEvent;
    
            protected virtual void OnWrite(TransferEventArgs e)
            {
                TransferEventHandler handler = WriteEvent;
                if (handler != null)
                    handler(this, e); // Invokes the delegates
            }
    
            protected virtual void OnError(Exception excep)
            {
                TransferEventHandler handler = ErrorEvent;
                if (handler != null)
                    handler(this, e); // Invokes the delegates
            }
    Ich bekomme den Fehler keine Überladung ist möglich für OnError in der main Methode, wie kann ich jedes mal bei catch OnError aufrufen und gleichzeitig den Exception übergeben
    Danke im Vorraus

  • #2
    Mach doch einfach 2 unterschiedliche EventTypen. Ein OnError Event hat bestimmte andere Parameter als ein OnWrite Event. Also gibts auch 2 unterschiedliche Funktionsparameter. Ausserdem solltest Du den generischen EventHandler<T> verwenden anstatt eigene Eventtypen zu definieren.

    [highlight=c#]
    public class Transfer()
    {
    //the public EventHandlers
    public event EventHandler<WriteEventArgs> WriteOccured;
    public event EventHandler<WriteErrorEventArgs> WriteErrorOccured;

    //the invokers of the events
    protected void OnWriteOccured(WriteEventArgs e)
    {
    if(WriteOccured != null)
    WriteOccured(this, e);
    }

    protected void OnWriteOccured(WriteErrorEventArgs e)
    {
    if(WriteErrorOccured != null)
    WriteErrorOccured(this, e);
    }


    //write somethings to transfer
    public void TransferStuff(object objectToTransfer)
    {
    bool writeWasOk = false;
    Exception writeException = null;

    //Do Transfer stuff and set writeWasOk and writeException

    if(writeWasOk)
    OnWriteOccured(new WriteEventArgs { ObjectToTransfer = objectToTransfer });
    else
    OnWriteErrorOccured(new WriteErrorEventArgs { ObjectToTransfer = objectToTranser, Exception = writeException });
    }
    }

    public class WriteEventArgs:EventArgs
    {
    public Object ObjectToTransfer { get; set; }
    }

    public class WriteErrorEventArgs:EventArgs
    {
    public Object ObjectToTransfer { get; set; }
    public Exception Exception { get; set; }
    }
    [/highlight]

    Hoffe das hilft

    Comment


    • #3
      Wie ist den TransferEventHandler definiert?

      Die Methoden die du als Handler benutzt müssen auch dieser Definition entsprechen. Da OnWrite und OnError unterschiedliche Signaturen haben muss mindestens 1 von beiden zwangsweise falsch sein.

      Das was du da programmierst scheint mir ein wenig konfus. Du mußt Exceptions mit einem try catch Block fangen. Wo braucht man da noch einen Event? Ruf einfach aus dem catch Block die Methoden der HandleTransferEvents Klasse auf(und nenne die Klasse dann auch anders).

      Comment


      • #4
        Danke für eure Antworte,
        Ziel ist es wenn ein Exception auftritt in den soll in den catch den Event ausgelöst und das Fehler an den Event weitergegeben werden beispiel:
        Code:
         catch (Exception ex)
                    {
                        //ExceptionInformation.DisplayException(ee);
                        OnError(e, ex });
                    }
        Mein Handler ist wie folgt definiert:

        Code:
            public class HandleTransferEvents
            {
        
                public void OnRead(object sender, TransferEventArgs e)
                {
                    Console.WriteLine("Transfer: {0} - Read: {1}:{2}", e.TransferDate, e.TransferName, e.FileName);
                }
        
                public void OnWrite(object sender, TransferEventArgs e)
                {
                    Console.WriteLine("Transfer: {0} - Write: {1}:{2}", e.TransferDate, e.TransferName, e.FileName);
                }
        
                public void OnError(object sender, Exception excep)
                {
                    ExceptionInformation.DisplayException(excep);
                }
        
            }

        Comment


        • #5
          Ich wiederhole

          Wie ist den TransferEventHandler definiert?

          Comment


          • #6
            Ich komme leider nicht richtig mit bin noch anfängerin meinst du:
            Code:
               public delegate void TransferEventHandler(object sender, TransferEventArgs e);
                public delegate void FileTransferEventHandler(object sender, string filename, long filesize);
                public delegate void ErrorEventHandler(object sender, Exception e);

            Comment


            • #7
              Dann meintest du an dieser Stelle

              Code:
              tlp.ErrorEvent += new TransferEventHandler(tet.OnError);
              wahrscheinlich

              Code:
              tlp.ErrorEvent += new ErrorEventHandler(tet.OnError);
              Oder einfach

              Code:
              tlp.ErrorEvent += tet.OnError;

              Comment


              • #8
                ja ich habe es in mein Main Methode so stehen
                tlp.ErrorEvent += new ErrorEventHandler(tet.OnError);
                Ich bekomme aber immer die Exception
                Keine Überladung für die OnError-Methode nimmt 2 Argumente an.

                Comment


                • #9
                  Danke ich habe mein Fehler jetzt gefunden

                  Comment

                  Working...
                  X