如何在WinForms应用程序中处理表单?

时间:2011-02-22 09:37:12

标签: c# .net winforms dispose

我有windows应用程序检查adobe acrobat是否安装在PC中如果安装了pdf文件将显示从cd如果没有安装安装程序窗口出现设置acrobat我做了我的代码将但我想在pdf文件运行时窗户形式处理我做了,但这出现了:

  

无法访问已处置的对象。对象名称:'Checker'。

public Checker()
{
    InitializeComponent();
    Check();                          
}
//static void main()
//{

//    Checker ck = new Checker();
//    ck.Show();
//    Application.Run();
//}
public  void Check()
{
    try
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();
        RegistryKey adobe = Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("AMD");

        if (adobe == null)
        {
            panel1.Show();
        }
        else
        {
            foreach (DriveInfo d in allDrives)
            {
                switch (d.DriveType)
                {
                    case DriveType.CDRom:
                        Process myProcess = new Process();
                        myProcess.StartInfo.FileName = d.Name + "Environment.docx";
                        myProcess.Start();

                        break;
                }
            }
        }
    }
    catch
    {
        MessageBox.Show("error occured");
    }

    this.Dispose();
}

5 个答案:

答案 0 :(得分:2)

在绝大多数情况下,您应该在您的代码中调用this.Dispose()。通过将此调用放在从构造函数调用的方法中,您实际上是将当前对象从您自己的下方处理出来。当您尝试通过调用其Show方法访问下一行的表单对象时,运行时会检测到该错误并向您显示错误。

在这种情况下,如果您想在Check方法完成后关闭表单,则应该调用Close method

this.Close();

答案 1 :(得分:2)

您正在做的是创建一个表单,处理它,然后显示它。

使用显式处理很少有好处,但问题是你在处理后试图使用处理对象,因此应用程序崩溃。

尝试使用Check()关闭this.Close()方法中的表单,并使用using语句确保在完成表单后确实会处理该表单,例如这样:

using (Checker ck = new Checker())
{
    ck.Show();
}
Application.Run();

答案 2 :(得分:1)

这是因为您在this.Dispose();方法中调用Check,该方法是从构造函数调用的。基本上你是在构造函数中处理表单,使其无法使用。

在我看来,好像你应该把逻辑分开一点。创建一个执行检查的方法,返回一个bool,指示是否应该显示表单,然后只有在屏幕上显示时才创建和显示表单。

答案 3 :(得分:0)

您已经在构造函数中调用的Check()方法中处理了表单。

然后执行show方法,在此阶段,您已经处置了对象。

自动释放.net中的内存,为什么要显式调用dispose?

答案 4 :(得分:0)

处理表单与退出应用程序不同。 尝试Application.Exit()。