Spacewalker
Spacewalker

Reputation: 571

C# trigger event

I use C# and I want to trigger an event from within a class :

So if the Price property of a class was changed then an event onPriceChanged (outside the class) should be fired. However, I get an error:

The name 'onPriceChanged' does not exist in the current context

How could I fix this? (I guess that I could pass the eventhandler to the class via constructor...but if possible I would prefer not to pass the eventhandler to the class)

Here is my code :

using System;

public delegate void delEventHandler();

class clsItem
{
    //private static event delEventHandler _show;
    private delEventHandler _show;
    private int _price;

    public clsItem()  //Konstruktor
    {
        _show += new delEventHandler(Program.onPriceChanged);  //  error here :  The name 'onPriceChanged' does not exist in the current context
    }

    public int Price
    {
        set
        {
            _price = value;
            _show.Invoke();  //trigger Event when Price was changed
        }
    }
}

class Program
{
    static void Main()
    {
        clsItem myItem = new clsItem();
        myItem.Price = 123;   //this should trigger Event "onPriceChanged"
    }

    //EventHandler 
    public static void onPriceChanged()
    {
        Console.WriteLine("Price was changed");
    }
}

Upvotes: 0

Views: 21179

Answers (3)

Jamiec
Jamiec

Reputation: 136174

You're doing this the wrong way round - you're trying to attach the event handler from the class, and clearly that cannot have access to the Program.onPriceChanged method!

You should expose your event, and attach the event handler from the client code (Program).

class clsItem
{
    //private static event delEventHandler _show;
    private delEventHandler _show;
    private int _price;

    public clsItem()  //Konstruktor
    {

    }

    public event delEventHandler Show
    {
        add { _show += value; }
        remove { _show -= value; }
    }

    public int Price
    {
        set
        {
            _price = value;
            _show?.Invoke();  //trigger Event when Price was changed
        }
    }
}

And:

clsItem myItem = new clsItem();
myItem.Show += onPriceChanged;
myItem.Price = 123;   //this now does trigger Event "onPriceChanged" 

Live example: http://rextester.com/WMCQQ40264

Upvotes: 2

akardon
akardon

Reputation: 46046

The way you're dealing with events is not a good practice. the reason why we use Events is to decouple the objects we create from the methods they need to call.

For example if you want to create another object of the same type(clsItem) and get it to call another method once its price changed, you get into trouble. So I'd suggest this code rather than the current one:

using System;

public delegate void delEventHandler();

class clsItem
{
    public event delEventHandler PriceChanged;
    private int  _price;

    public clsItem()  //Konstruktor
    {

    }

    public int Price
    {
        set { 
              if(value!=_price) // Only trigger if the price is changed
              {
                _price = value;
                if(PriceChanged!=null) // Only run if the event is handled
                {
                    PriceChanged();
                }
              }
            }
    }   
}       

class Program
{   
    static void Main()
    {
       clsItem myItem = new clsItem();
       myItem.PriceChanged += new delEventHandler(onPriceChanged);
       myItem.Price = 123;   //this should trigger Event "PriceChanged" and call the onPriceChanged method
    }

    //EventHandler 
    public static void onPriceChanged()
    {
        Console.WriteLine("Price was changed");
    }
}

Upvotes: 1

seairth
seairth

Reputation: 2062

Here is the more traditional way of doing what you want:

public delegate void delEventHandler();

class clsItem
{
    public event delEventHandler Show;
    private int _price;

    public clsItem()  //Konstruktor
    {
    }

    public int Price
    {
        set
        {
            _price = value;
            Show?.Invoke();  //trigger Event when Price was changed
        }
    }
}

class Program
{
    static void Main()
    {
        clsItem myItem = new clsItem();
        myItem.Show += onPriceChanged;
        myItem.Price = 123;   //this should trigger Event "onPriceChanged"
    }

    //EventHandler 
    public static void onPriceChanged()
    {
        Console.WriteLine("Price was changed");
    }
}

Notice that clsItem no longer knows who is subscribing to its event. All it cares about is notifying any listeners who happens to be subscribed. There is no longer a dependency between clsItem and the onPriceChanged method.

Upvotes: 0

Related Questions