Anuya
Anuya

Reputation: 8350

manually firing the event in c#

i want to fire an event manually using c#. For instance, say if i want to fire a Form_closing event of Form A from Form B. How to do it ??

After getting some comments. I think i need to explain more on this.

Since my Form A is reference to a .dll which creates a custom taskbar in the desktop, There is a situation for me to close the that custom taskbar from Form B. i already tried FormA.Close() from Form B. when i do this, the .dll is unloaded from the app domain and due to this the space occupied by the custom task bar is blocked.

But that is not the case when i click the close button in the custom task bar. when i do this the space is freed up.

This is the reason i want to fire the close event of Form A manually from Form B which will solve my issue.

Thanks.

Upvotes: 6

Views: 30353

Answers (4)

Evgeny
Evgeny

Reputation: 3332

We did the following in one project:

There was a GlobalNotifier class, which defined events we wanted to use in different modules of the application, like this

public static class GlobalNotifier
{

    public static event VoidEventHandler EnvironmentChanged;

    public static void OnEnvironmentChanged()
    {
        if (EnvironmentChanged != null)
        {
            EnvironmentChanged();
        }
    }
 }

Then, you could raise this event anywhere when you needed to let the rest of the application know that the environment has changed, like this

    GlobalNotifier.OnEnvironmentChanged();

And also you could subscribe to this event wherever you wanted to be notified about the fact that the environment has changed.

    public ReportingService()
    {
        GlobalNotifier.EnvironmentChanged += new VoidEventHandler(GlobalNotifier_EnvironmentChanged);
    }

    void GlobalNotifier_EnvironmentChanged()
    {
        //reset settings
        _reportSettings = null;
    }

So, whenever you changed the environment, you raised the event, and everyone who needed to know about that and perform some actions, was notified. Might be similar to what you need to achieve.

Also, if you need to pass parameters, you can define the event any way you like, basically -

    public static event VoidEventHandler<SomeObject, List<OtherObject>> SomethingUpdated;

    public static void OnSomethingUpdated(SomeObject sender, List<OtherObject> associations)
    {
        if (SomethingUpdated != null)
        {
            SomethingUpdated(sender, associations);
        }
    }

    // ...

    MyClass.SomethingUpdated+= new VoidEventHandler<SomeObject, List<OtherObject>>(MyClass_SomethingUpdated);

    // ...

    void MyClass_SomethingUpdated(SomeObject param1, List<OtherObject> param2)
    {
      //do something
    }

Upvotes: 14

Joel Coehoorn
Joel Coehoorn

Reputation: 416131

Close the form. That will raise the event. If you want to raise the event separately from closing the form, you're doing something wrong; move that code to a separate method that you can call from the event and from FormB.

FormAInstance.Close()

Starting with Visual Studio 2005 (.Net 2.0), forms have automatic default instances. It sounds like that's what you're using. You should know that this feature exists mainly for backwards compatibility with VB6. You're really better off creating and using a new instance of the form. When you do that, you should just be able to call the .Close() method on that instance without it's app domain closing.

If you want to re-use this space, you might also try simply .Hide()-ing the form rather than closing it.

Upvotes: 1

Ryan Lundy
Ryan Lundy

Reputation: 210350

It sounds to me, from your comments, like you don't want to raise one form's event from the other; you just want to handle one form's event from the other.

Yes, you can do that. FormB needs to have a reference to FormA. There are several ways you can do this; one easy way is to have a FormA type property in your FormB class, like this:

public FormA TheOtherForm { get; set; }

You set that property to your instance of FormA, and then you add the event handler as you've described in the comments.

You don't have to use FormA as the type of your property; any form has the FormClosing event, so you can just use Form as the type if you want.

Upvotes: 1

user153498
user153498

Reputation:

You would call the OnFormClosing() method of the Form class. You can do this with any event that has a paired On...() method.

Upvotes: 1

Related Questions