I am struggling with the delegate/event. Most likely I do not understand the whole picture. for the sake of argument, I have two forms: form 1 and form 2.
Questions:
- How to appropriately unsubscribe the event "frm2.ButtonClicked -= new PassMsg(MsgReceivedFromFrm2);"?
- If I kill form 2, I still get the confirming message.why does this happenning?
:
public partial class Form1 : Form
{
PassMsg NotifyFrm2EventHandler; // Delegate definition
PassMsgWithConfirm NotifyFrm2WithConfirmEventHandler; // Delegate with return definition
event PassMsg NotifyFrm2AsEvent; // Event definition
int i;
public Form1()
{
InitializeComponent();
i = 0;
}
private void btn_InitializeFrm2_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
NotifyFrm2EventHandler = new PassMsg(frm2.ReceiveMsgFromForm1); // setup link from Form 1 to Form 2
NotifyFrm2WithConfirmEventHandler = new PassMsgWithConfirm(frm2.ReceiveMsgFromForm1withConfirm); // setup link from Form 1 to Form 2
NotifyFrm2AsEvent += new PassMsg(frm2.ReceiveMsgFromForm1); // setup link from Form 1 to Form 2
frm2.ButtonClicked += new PassMsg(MsgReceivedFromFrm2); // setup link from Form 2 to Form 1
frm2.Show();
}
private void btn_Send2Frm2_Click(object sender, EventArgs e)
{
i++;
NotifyFrm2EventHandler?.Invoke("message from form 1 with index " + i.ToString()); // Notification by Call
}
private void btn_Send2Frm2WithConfirm_Click(object sender, EventArgs e)
{
i++;
bool confirmed = (bool)(NotifyFrm2WithConfirmEventHandler?.Invoke("message from form 1 with confirm with index" + i.ToString())); // Notification by Call
if (confirmed)
{
MessageBox.Show("confirmed.");
}
}
private void btn_sendAsEvent_Click(object sender, EventArgs e)
{
i++;
NotifyFrm2AsEvent?.Invoke("message from form 1 as event with index" + i.ToString()); // Notification by Call
}
void MsgReceivedFromFrm2(string input)
{
label1.Text = input;
}
}
And form2 code:
public partial class Form2 : Form
{
public event PassMsg ButtonClicked; // Event definition
public Form2()
{
InitializeComponent();
}
public void ReceiveMsgFromForm1(string input)
{
label1.Text = input;
}
public bool ReceiveMsgFromForm1withConfirm(string input)
{
label1.Text = input;
return true;
}
private void button1_Click(object sender, EventArgs e)
{
ButtonClicked("Message from Form 2");
}
}