C# フォームを連続で開閉を繰り返した結果、中途半端にフォームが残る
お世話になります。
表題の内容では、ほとんど意味が解らないと思います。
Form1,A,B,C,D,E,Formlessという7つのフォームがあり、Form1はただ単にAを
ShowDialogで開くだけ、AはBとDを、BはCを、CはFormlessを、DはCとEを、
EとFormlessは末端の子供として、それぞれがShowDialogで開くという、
親子関係のプログラムです。
Form1以外のフォームに、フォームが開かれた後、自動で閉じるか子を開くかという
コードになっています。その流れをUFormという基本クラスで、Activatedとtimer_Tickを
使用して実装しています。Formlessまで達したときに、カウントを取り、
Aのフォームでそのカウントされた値を見て、一定値以上に達していれば処理を止めると
いった感じです。
さて、問題は無事にカウントが一定以上にたまった時です。Aのフォームでカウントを
チェックしている以上、Dialogで表示している全ての子のフォームが閉じないとAのカウント
チェックには到達しないと思うのですが、カウントに達した処理が発生した後も、
Bのフォームだけが開いたままになっています。これが何故なのか解りません。
AからEまで、構造は若干の違いがありますが、大きな変化はありません。
決まって毎回Bが開くというのが不可解です。
原因と対策をお教えいただきたいと思います。
下記に、全ソースを記述します(デザイン部分のDesigner.csは省略します)。
timerのintervalは1にしてあります。
何卒よろしくお願いいたします。
UForm すべてのフォームで継承するクラス
using System;
using System.Drawing;
using System.Windows.Forms;
namespace FormTest2
{
public partial class UForm : Form
{
public UForm()
{
InitializeComponent();
this.ClientSize = new Size(640,480);
}
protected virtual void action(string command)
{
MessageBox.Show(command);
}
public int ID
{
get; set;
}
private void UForm_HelpButtonClicked(object sender, System.ComponentModel.CancelEventArgs e)
{
this.help();
e.Cancel = true;
}
public virtual void help()
{
MessageBox.Show("ヘルプが押されました。");
}
private void timer1_Tick(object sender, EventArgs e)
{
this.timer1.Enabled = false;
this.autoexec();
}
private void UForm_Activated(object sender, EventArgs e)
{
if (Form1.auto)
{
this.timer1.Enabled = true;
}
}
protected virtual void autoexec()
{
}
}
}
Form1.cs(起動のメインフォーム。ここから始まります。)
using System;
using System.Windows.Forms;
namespace FormTest2
{
public partial class Form1 : Form
{
public static bool auto = true;
public static int count = 0;
public static bool flg = true;
private readonly A a = new A();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
count = 0;
a.ShowDialog(this);
auto = false;
MessageBox.Show(count + "回です。");
}
}
}
A.cs
using System;
namespace FormTest2
{
public class A : UForm
{
private B b = new B();
private D d = new D();
private System.Windows.Forms.Button btnB;
private System.Windows.Forms.Button btnD;
public A()
{
InitializeComponent();
this.ClientSize = new System.Drawing.Size(580, 395);
}
protected override void autoexec()
{
int i = new Random().Next(2);
this.action("" + i);
}
protected override void action(string value)
{
string st = value;
if (st == "0")
{
b.ShowDialog(this);
}
else
{
d.ShowDialog(this);
}
if (Form1.count >= 100)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
}
private void InitializeComponent()
{
this.btnB = new System.Windows.Forms.Button();
this.btnD = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btnB
//
this.btnB.Location = new System.Drawing.Point(18, 22);
this.btnB.Name = "btnB";
this.btnB.Size = new System.Drawing.Size(138, 55);
this.btnB.TabIndex = 7;
this.btnB.Text = "B";
this.btnB.UseVisualStyleBackColor = true;
//
// btnD
//
this.btnD.Location = new System.Drawing.Point(18, 83);
this.btnD.Name = "btnD";
this.btnD.Size = new System.Drawing.Size(138, 55);
this.btnD.TabIndex = 8;
this.btnD.Text = "D";
this.btnD.UseVisualStyleBackColor = true;
//
// A
//
this.ClientSize = new System.Drawing.Size(640, 480);
this.Controls.Add(this.btnD);
this.Controls.Add(this.btnB);
this.Name = "A";
this.Text = "A";
this.Controls.SetChildIndex(this.btnExit, 0);
this.Controls.SetChildIndex(this.btnB, 0);
this.Controls.SetChildIndex(this.btnD, 0);
this.ResumeLayout(false);
}
}
}
B.cs
using System;
namespace FormTest2
{
public class B : UForm
{
private C f = new C();
public B()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// B
//
this.ClientSize = new System.Drawing.Size(424, 267);
this.Name = "B";
this.Text = "B";
this.ResumeLayout(false);
}
protected override void autoexec()
{
int i = new Random().Next(3);
this.action("" +i);
}
protected override void action(string value)
{
string st = value;
if (st == "0")
{
this.Close();
}
else
{
f.ShowDialog(this);
}
}
}
}
C.cs
using System;
namespace FormTest2
{
public class C : UForm
{
private Formless f = new Formless();
public C()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// C
//
this.ClientSize = new System.Drawing.Size(239, 226);
this.Name = "C";
this.Text = "C";
this.ResumeLayout(false);
}
protected override void autoexec()
{
int i = new Random().Next(4);
this.action("" + i);
}
protected override void action(string value)
{
string st = value;
if (st == "0")
{
this.Close();
}
else
{
f.ShowDialog(this);
}
}
}
}
D.cs
using System;
namespace FormTest2
{
public class D : UForm
{
private E e = new E();
private C c = new C();
public D()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// D
//
this.BackColor = System.Drawing.Color.Red;
this.ClientSize = new System.Drawing.Size(473, 408);
this.Name = "D";
this.Text = "D";
this.ResumeLayout(false);
}
protected override void autoexec()
{
int i = new Random().Next(3);
this.action("" + i);
}
protected override void action(string value)
{
string st = value;
if (st == "0")
{
this.Close();
}
else if(st == "1")
{
e.ShowDialog(this);
}
else
{
c.ShowDialog(this);
}
}
}
}
E.cs
namespace FormTest2
{
public class E : UForm
{
public E()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// E
//
this.BackColor = System.Drawing.Color.Olive;
this.ClientSize = new System.Drawing.Size(823, 164);
this.Name = "E";
this.Text = "E";
this.ResumeLayout(false);
}
protected override void autoexec()
{
this.action("");
this.btnExit.PerformClick();
this.Close();
}
protected override void action(string value)
{
}
}
}
Formless.cs
namespace FormTest2
{
public class Formless : UForm
{
private System.ComponentModel.IContainer components;
public Formless()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// Formless
//
this.BackColor = System.Drawing.Color.Red;
this.ClientSize = new System.Drawing.Size(282, 253);
this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Formless";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.ResumeLayout(false);
}
protected override void autoexec()
{
this.action("");
}
protected override void action(string value)
{
Form1.count++;
}
}
}