0

目前我有一个程序来显示一些项目信息。我所拥有的是一个com box练习不同类别的面板,以及一个面板来显示com box.

我创建了自己的自定义控件来显示,但是当我将它动态添加到面板时,它会导致一个Win32 Exceptionwhich is Create Window handle Error.

经过多次测试,我注意到一旦面板总共列出了 1800 个自定义控件,就会出现异常。有没有人可以解决这个问题?谢谢。

private void DisplayItems(List<ITEM_DATA> ItemList)
{
    DisposeControls();
    int total = ItemList.Count;

    ItemDisplayer itemDisplayer = null;
    Application.DoEvents();
    for (int i = 0; i < total / 4 + 1; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            int m = (i * 4) + j;
            if (m >= total)
            {
                return;
            }
            itemDisplayer = new ItemDisplayer(ItemList[m], ref labItemName);
            itemDisplayer.Size = new Size(240, 80);
            itemDisplayer.Location = new Point(240 * j, 80 * i);
            itemDisplayer.Name = "itemDisplayer" + Convert.ToString(m);
            pnlItems.Controls.Add(itemDisplayer); 
        }
    }
}
4

1 回答 1

1

只是想确认一下。花了一段时间才弄清楚这个问题发生在哪里。我意识到用户对象已达到限制 10000。我刚刚通过正确处理用户控件解决了这个问题。

我在我的自定义控件类中重新实现了 dispose 方法。

 // Flag: Has Dispose already been called?
   bool disposed = false;
   // Instantiate a SafeHandle instance.
   SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
   { 
      Dispose(true);
      GC.SuppressFinalize(this);           
   }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
   {
      if (disposed)
         return; 

      if (disposing) {
         handle.Dispose();
         // Free any other managed objects here.
         //
      }

      // Free any unmanaged objects here.
      //
      disposed = true;
   }

根据此处输入链接描述

于 2016-07-26T17:36:54.867 回答