首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#Application.OpenForms与Form.Show()的有关问题。高手帮忙一上。多谢

2012-11-11 
C#Application.OpenForms与Form.Show()的问题。高手帮忙一下。谢谢。是否Application.OpenForms集合里的窗体

C#Application.OpenForms与Form.Show()的问题。高手帮忙一下。谢谢。
是否Application.OpenForms集合里的窗体都是要经过Form.Show()之后才可以列入Application.OpenForms;集合的?

我刚刚做了一个小测试。

C# code
        private void TestApplicationOpenFormsMethod()        {            #region 测试代码一            Form temp_form = new Form();            temp_form.Name = "MyForm";            foreach (Form f in Application.OpenForms)            {                if (f.Name == temp_form.Name)                {                    MessageBox.Show("I Found it.");                    return;                }            }            MessageBox.Show("I not found it.");//代码二可以执行到这里,说明Application.OpenForms集合是没有这个temp_form的。            return;            #endregion            #region 测试代码二            Form temp_form = new Form();            temp_form.Name = "MyForm";            temp_form.Show();//主要就是这里与测试代码一的不一样。            foreach (Form f in Application.OpenForms)            {                if (f.Name == temp_form.Name)                {                    MessageBox.Show("I Found it.");//代码二可以执行到这里,说明Application.OpenForms集合是有这个temp_form的。                    return;                }            }            MessageBox.Show("I not found it.");            return;            #endregion            //现在主要我想解决的是。            //我想窗体不想Show()之后Application.OpenForms里有我想要的指定的已经New过的Form;            //是否有相关的Application.属性呢?            //我也不可能用Form.Show()之后,再马上用Form.Hide()吧?这方法帮笨了。            //如果有现成的方法可以在不用Form.Show()后,又可以拿到所有已经new()过的(即在内存的位置的)的窗体的集合。            //我该怎么写呢?        }


[解决办法]
为什么不用一个静态全局变量记录你所有new过的Form呢?如果一个Form不被Show()出来,那么离开了它的作用域范围,该对象会自动释放的,所谓的垃圾回收吧,所以Application也没必要去记录它,你只有靠自己去记录,那样就不会被自动释放。
[解决办法]
我感觉你想解决的问题是只实例化一个对象?那用singleton模式吧
[解决办法]
private int nNumber = 1;
private void frmMain_Load(object sender, EventArgs e)
{
RefreshListBox();
}

private void button1_Click(object sender, EventArgs e)
{
Form form = new Form();
form.Name = nNumber.ToString();
form.Text = nNumber.ToString();
form.Show();
nNumber++;
RefreshListBox();
}

private void button2_Click(object sender, EventArgs e)
{
if (-1 == listBox1.SelectedIndex)
{
return;
}
Application.OpenForms[listBox1.Items[listBox1.SelectedIndex].ToString()].Close();
RefreshListBox();
}

private void RefreshListBox()
{
listBox1.Items.Clear();
foreach (Form form in Application.OpenForms)
{
listBox1.Items.Add(form.Name);
}
}

[解决办法]
Application.OpenForms 属性


属性值
类型:System.Windows.Forms.FormCollection

包含属于此应用程序的所有当前打开窗体的 FormCollection。


请问LZ怎么理解 当前打开窗体 这个字眼,没有Show难道是打开?
[解决办法]
不过不想Show就在一个地方加入一个静态Dictionary<string,Form>字典(比如在常用的Program类里),记录所有已经new出来的窗体实例,每次在里面找你指定的键值即可!
[解决办法]
你要想加入到Application.OpenForms,只需要调用Form.Load方法就可以了,如下:

C# code
Form1 f = new Form1();//此时没有Application.OpenForms中还不存在ff.OnLoad(null);//此时Application.OpenForms中已存在f//f.Show(this)//只有调用了这个Show才会显示出窗体,这个不调用就不显示 


[解决办法]

探讨
你要想加入到Application.OpenForms,只需要调用Form.Load方法就可以了,如下:

C# codeForm1 f=newForm1();//此时没有Application.OpenForms中还不存在ff.OnLoad(null);//此时Application.OpenForms中已存在f//f.Show(this)//只有调用了这个Show才会显示出窗体,这个不调用就不显示


[解决办法]
探讨
你可以使用下面的代码测试:

C# code
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
foreach (Form frm in Application.OpenForms)
{
Console.WriteLine(frm.Name);
}
Form1 f = new Form1();
f.OnLoad(null);
foreach (Form frm in Application.OpenForms)
{
Console.WriteLine(frm.Name);
}
//f.Show();
}

热点排行