Je n'arrive pas à gérer le scénario dans lequel un événement est levé et espère obtenir de l'aide.Comment éviter d'élever un événement à un formulaire fermé?
Scénario (voir ci-dessous le code de référence):
Form1
ouvreForm2
Form1
est abonnée à un événement surForm2
(appelons l'événementFormAction
)Form1
est fermé etForm2
reste ouvertForm2
déclenche l'événementFormAction
En Form1.form2_FormAction
, pourquoi this
renvoie une référence à Form1
mais button1.Parent
retours null
? Ne devraient-ils pas tous les deux retourner la même référence?
Si nous devions omettre l'étape 3, les deux this
et button1.Parent
renvoient la même référence.
Voici le code que je utilise ...
Form1:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click (object sender , EventArgs e)
{
// Create instance of Form2 and subscribe to the FormAction event
var form2 = new Form2();
form2.FormAction += form2_FormAction;
form2.Show();
}
private void form2_FormAction (object o)
{
// Always returns reference to Form1
var form = this;
// If Form1 is open, button1.Parent is equal to form/this
// If Form1 is closed, button1.Parent is null
var parent = button1.Parent;
}
}
Form2:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public delegate void FormActionHandler (object o);
public event FormActionHandler FormAction = delegate { };
private void button1_Click (object sender , EventArgs e)
{
FormAction("Button clicked.");
}
}
Idéalement, je voudrais éviter de soulever des événements formes fermées/éliminées (dont je ne suis pas sûr est possible) ou trouver un moyen propre de gérer cela dans l'appelant (dans ce cas, Form1
).
Toute aide est appréciée.
La conception de l'application permet aux formulaires enfants de rester ouverts après la fermeture du parent. Malheureusement, je ne suis pas en mesure de changer le design. –