/ / Stop rodičovského formulára z uzavretia - c #, formuláre, winformy

Zastaviť rodičovský formulár od zatvorenia - c #, formulárov, winforms

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ď č. 1

Odporúč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é:

  1. Definujte formulár základnej triedy, ktorý vystavuje virtuálnu vlastnosť readonly AskBeforeClosing
  2. 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
  3. Uchovávajte všetky deti v zozname vo formulári1.
  4. 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