博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Application.OpenForms

Posted on 2011-03-21 10:45  gczhao  阅读(1462)  评论(0编辑  收藏  举报

本文转自:http://www.rainsts.net/article.asp?id=489

 

今天不小心遇到一个有点弱智的问题,当然这个问题基本对你没有任何影响。

.NET FX 2.0 WinForm 提供了 Application.OpenForms 属性,便于我们获取已 "打开" 的窗体。相信下面的代码你非常熟悉。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form form = Application.OpenForms["form2"];
        if (form == null)
        {
            form = new Form2();
        }

        form.Show();
        form.BringToFront();
    }
}


这代码会有问题吗?跟着我做……

创建 WinForm 项目,然后创建 Form1、Form2 两个窗体,在 Form1 上添加一个按钮,然后输入上述事件代码。注意,我们目前没有修改任何 Form2 的设置。运行一下,多次点击按钮,你看到了什么? [lol] 这就是我说的问题,Form2 被多次创建,也就是说 Application.OpenForms["form2"] 始终返回 null。怎么会这样?打开 Form2.Designer.cs,看看 InitializeComponent()。

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.Text = "Form2";
}


倒~~~~ 自动生成的代码根本没有 this.Name="Form2"。一旦更改 Form2.Size 或其他属性,代码才会变成下面这样。

private void InitializeComponent()
{
    this.SuspendLayout();
    // 
    // Form2
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(711, 427);
    this.Name = "Form2";
    this.Text = "Form2";
    this.ResumeLayout(false);

}


好了,小笑话到此结束。本文没有多大实际意义,纯粹搞笑~~~~~~ [sweat]