|
There are many ways to communicate from one form to another in a Windows
Forms .NET application. However, when using MDI (Multiple Document Interface)
mode, you may often find that the wiring up of simple events may better
suit your needs. This short article illustrates one of the simplest techniques
for having a Child MDI form call back to its parent Container Form and
even how to pass an object instance (which could contain an entire class,
if you like) back to the Parent.
Fire up Visual Studio .NET and create a new Windows Application project.
In the Properties window with your Default Form1 selected, change the
IsMDIContainer property to "true". Add a Panel at the top, and add a
button and a label to it, with the Panel taking up, say, the top 20%
of the form's designer surface.
Now add a new form to the project.
Let's call it MDIChild. On the Kid form, add a button which we will
use to call the event to the Daddy form and also close the Kid.
At this point, your Daddy form should look something like this:
Now lets wire up our event and event handlers, starting with the Kid:
First we need a custom EventArgs derived class so we can pass the
information we need:
using System;
using System.Collections.Generic;
using System.Text;
namespace MDIFormsEvents
{
public
class
NotifyDaddyEventArgs :System.EventArgs
{
public
readonly
string Message;
public
NotifyDaddyEventArgs(string
message)
{
Message = message;
}
}
}
In our Codebehind for the Kid form, lets add our event and eventhandler,
and make the call in our Button1_Click event:
// declare the EventHandler
public
event
EventHandler
NotifyDaddy;
// Wire up the event
protected
void OnNotifyDaddy()
{
if(NotifyDaddy
!=null)NotifyDaddy(this,new
NotifyDaddyEventArgs("Howdy
Pop!"));
}
private
void
button1_Click(object
sender, System.EventArgs
e)
{
// call the event
this.OnNotifyDaddy();
this.Close();
}
Note that we are passing "Howdy Pop" in the
EventArgs parameter. This can really be any business
logic you want. If your Kid form created a DataSet that you needed for
the Daddy to receive, you would plug it in here. All Daddy would need
to know is that he is expecting a DataSet from the Kid in the EventArts
parameter.
Now, in our Daddy Form, we are going to wire up everything
we need to show the kid and also to receive his event message:
private void button1_Click(object sender, System.EventArgs
e)
{
// declare and instantiate the Kid
MDIChild chForm = new MDIChild();
//set parent form for the child window
chForm.MdiParent=this;
// make it fill the container
chForm.WindowState=FormWindowState.Maximized;
// add the event handler we wired up
chForm.NotifyDaddy+=new EventHandler(chForm_NotifyDaddy);
// show the Kid
chForm.Show();
}
private void
chForm_NotifyDaddy(object
sender, EventArgs
e)
{
lblMessage.Text= " Child Form Called
me! and sent:\n";
lblMessage.Text+= ( (NotifyDaddyEventArgs)e).Message+"\n"
;
lblMessage.Text+=e.GetHashCode().ToString();
}
Note that we create chForm.NotifyDaddy and add chForm_NotifyDaddy
to the Delegates. Then in the handler itself, we write out the message
including the value of the sender (in this case it is just some text).
Your result when the Kid form is closed should look something like this:

And that's all it takes to teach all your kids to call home to Daddy!
The full solution is ready to go at the link below.
Download the Source Code that accompanies this article |