2012-07-10 31 views
0

当我第二次打开在运行时创建的表单时,我不断收到一条错误消息,指出“无法访问已释放的对象”。 “Object name'Form'”这是函数的代码。它由一个buttonclick事件调用。我已经看遍了整个网络,发现有类似问题的人,但是我已经尝试了这些修复程序,但都没有工作。不知道如何解决这个问题。 VS高亮显示该行frmFavorites.Show();第二次无法打开表单 - 不断获取错误

预先感谢您。

public void frmMyBrowser_ShowFavorites(object sender, EventArgs e) 
{   
    frmFavorites.ShowIcon = false; 
    frmFavorites.ShowInTaskbar = false; 
    frmFavorites.Text = "Bookmarks"; 
    frmFavorites.Width = 500; 
    frmFavorites.Height = 320; 
    frmFavorites.Controls.Add(lstFavorites); 
    frmFavorites.Controls.Add(btnRemoveFavorite); 
    frmFavorites.Controls.Add(btnAddFavorite); 
    frmFavorites.Controls.Add(txtCurrentUrl); 
    lstFavorites.Width = 484; 
    lstFavorites.Height = 245; 
    btnRemoveFavorite.Location = new Point(397, 255); 
    btnAddFavorite.Location = new Point(8, 255); 
    txtCurrentUrl.Location = new Point(110, 255); 
    txtCurrentUrl.Size = new Size(265, 20); 
    btnAddFavorite.Text = "Add"; 
    btnRemoveFavorite.Text = "Remove"; 
    txtCurrentUrl.Text = wbBrowser.Url.ToString(); 
    btnAddFavorite.Click += new EventHandler(btnAddFavorite_Click); 
    btnRemoveFavorite.Click += new EventHandler(btnRemoveFavorite_Click); 
    frmFavorites.Load += new EventHandler(frmFavorites_Load); 
    frmFavorites.Show(); 
    frmFavorites.FormClosed += new FormClosedEventHandler(frmFavorites_FormClosed); 

    StreamReader reader = new System.IO.StreamReader(@Application.StartupPath + "\\favorites.txt"); 
    { 
     while (!reader.EndOfStream) 
     { 
      for (int i = 0; i < 4; i++) 
      { 
       string strListItem = reader.ReadLine(); 
       if (!String.IsNullOrEmpty(strListItem)) 
       { 
        lstFavorites.Items.Add(strListItem); 
       } 
      } 
     } 
     reader.Close(); 
    }   
} 

public void btnAddFavorite_Click(object sender, EventArgs e) 
{ 
    lstFavorites.Items.Add(wbBrowser.Url.ToString()); 
} 

public void btnRemoveFavorite_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     lstFavorites.Items.RemoveAt(lstFavorites.SelectedIndices[0]); 
    } 
    catch 
    { 
     MessageBox.Show("You need to select an item", "Error"); 
    } 
} 
public void frmFavorites_Load(object sender, EventArgs e) 
{  
} 

public void frmFavorites_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    StreamWriter writer = new System.IO.StreamWriter(@Application.StartupPath + "\\favorites.txt"); 
    { 
     for (int i = 0; i < lstFavorites.Items.Count; i++) 
     { 
      writer.WriteLine(lstFavorites.Items[i].ToString()); 
     } 
     writer.Close(); 
    } 
    frmFavorites.Close(); 
} 
+1

也许而不是'frmFavorites_FormClosed'而是使用'frmFavorites_FormClosing'。它在表格关闭之前会触发**。 “FormClosed”在已经关闭之后触发 - 这可能是您获取错误的地方。 – tobias86 2012-07-10 07:34:57

+1

每当您实例化一个流时,都应该使用'using',以确保它们被关闭并正确放置。这可能与您遇到的问题没有任何关系,只是一般的C#建议。 – 2012-07-10 07:38:32

回答

2

不能重新打开已关闭的形式。当表单关闭时(1)它被释放并且(2)底层操作系统窗口句柄被释放。

我猜你可能能够采取何种形式的构造函数的内容并把它放进你可以打电话到重新打开窗体的方法,但我真的不建议这样做,即使它的工作。

相反,只需创建一个新的窗体实例。

2

试试这个

public void frmMyBrowser_ShowFavorites(object sender, EventArgs e) 
{ 
    frmFavorites = new Form(); 

    .... 
    .... 

}