1。在明确不使用对象的时候,调用Dispose是对的。这样可明确的释放对象。2.在你清除已有控件的时候,必须panel.Clear();才行。

解决方案 »

  1.   

    for (int i = panelMain.Controls.Count - 1; i >= 0; --i)
    panelMain.Controls[i].Dispose();
    --〉
    for (int i = panelMain.Controls.Count - 1; i >= 0; --i)
    {
             panelMain.Controls.Clear();
    panelMain.Controls[i].Dispose();
    }
      

  2.   

    to haiwangstar(南河三(天狼星上有没有普及C#)) :加panel.Clear();我也试过,但还是不行,实际上我在跟踪调试的时候,发现执行完panelMain.Controls[i].Dispose();的时候panelMain.Controls.Count已经是0了,所以我认为加不加panel.Clear();应该不是问题的核心所在
      

  3.   

    to The123(在我地盤這 伱就得聽我的) :有没有搞错?panelMain.Controls都已经Clear()了,还去执行panelMain.Controls[i].Dispose();不出错就怪了
      

  4.   

    刚刚我把
    for (int i = panelMain.Controls.Count - 1; i >= 0; --i)
    panelMain.Controls[i].Dispose();
    屏蔽掉了,在uc.Focus();前面添加了uc.BringToFront();这样没有出现任何问题,所以我觉得问题还是出在panelMain.Controls[i].Dispose();上
      

  5.   

    你让你的uc作成一个全局的,保证程序中只有一个uc,每次用的时候把一个新的控件给了它就是了,最后和窗体一块释放.
      

  6.   

    你不要Dispose(); 直接Clear试一下。。
      

  7.   

    搞定了,原来在新的UserControl加载之后再释放老的UserControl就没有问题了,谢谢楼上各位
    //通过Id获取UserControl的实例
    UserControl uc = GetUserControlById(id);uc.Dock = System.Windows.Forms.DockStyle.Fill;//把新的UserControl添加到Panel中
    panelMain.Controls.Add(uc);//清除Panel中的其他已加载的UserControl
    for (int i = panelMain.Controls.Count - 2; i >= 0; --i)
    panelMain.Controls[i].Dispose();
    uc.Focus();