现在的位置: 首页 > 综合 > 正文

Application.OpenForms

2013年12月07日 ⁄ 综合 ⁄ 共 1179字 ⁄ 字号 评论关闭
今天不小心遇到一个有点弱智的问题,当然这个问题基本对你没有任何影响。

.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]  

抱歉!评论已关闭.