Mám aplikáciu winforms a potrebujem dobrý spôsob, ako zvládnuť nasledovné.
V podstate mám hlavnú žiadosť, v rámci ktorej mám formy dieťaťa.
Používateľ môže na rodičovskom formulári naraziť na tlačidlo „close“. Ale vo forme dieťaťa sa môžu diať niektoré veci. Napríklad som mohol editovať niektoré databázové polia.
V súčasnosti zachytávam blízke dieťa a správne ukladám všetky zmeny.
Teraz však chcem, aby bola táto možnosť zrušená. Takže podriadený formulár by vyzval používateľa a mohol by aplikáciu zrušiť.
Snažil som sa e.Zrušiť v rámci zatváracej udalosti dieťaťa, ale toto nie je "fungujúce - ja" m za predpokladu, že rodič sa stále zatvára ... Existuje spôsob, ako zrušiť proces zatvárania rodičovského formulára z vnútra dieťaťa?
odpovede:
1 pre odpoveď č. 1Odporúčam na odber FormClosing
udalosť v hlavnom formulári a potvrdzujúce stavy pre každý formulár dieťaťa a zabránia uzavretiu formulára (ak sa vyžaduje). Nižšie uvedený kód vám môže pomôcť a poskytnúť im reálnu predstavu o podrobnostiach.
private void Main_FormClosing( object sender, FormClosingEventArgs e )
{
foreach(var f in childforms)
{
if(!f.CanClose())
{
e.Cancel = true;
return;
}
}
e.Cancel = false;
}
0 pre odpoveď č. 2
Tu je veľmi jednoduchý príklad pre jeden formulár dieťaťa. Ak užívateľ zadal niečo do textového poľa Form2, bude vyzvaný, keď sa pokúsi zatvoriť formulár1.
public partial class Form1 : Form
{
Form2 form2;
public Form1()
{
form2 = new Form2();
form2.Show();
InitializeComponent();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (form2.AskBeforeClosing)
{
e.Cancel = MessageBox.Show("Are you sure?","",MessageBoxButtons.OKCancel)==System.Windows.Forms.DialogResult.Cancel;
}
}
}
public partial class Form2 : Form
{
public bool AskBeforeClosing
{
get {
return textBox1.Text != "";
}
}
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
Ak potrebujete pracovať s variabilným počtom formulárov pre deti, musíte urobiť nasledovné:
- Definujte formulár základnej triedy, ktorý vystavuje virtuálnu vlastnosť readonly
AskBeforeClosing
- Odvodiť všetky podradené formuláre z tejto základnej triedy a prepísať vlastnosť pomocou špecifickej logiky, aby sa zabránilo náhodnému zatvoreniu
- Uchovávajte všetky deti v zozname vo formulári1.
- Loop zoznam vnútri obslužnej rutiny udalosti FormClosing, aby zistil, či AT LEAST jeden formulár majú AskBeforeClosing = true. Ak áno, vyzve používateľa