Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HandleDestroyed和HandleCreated不匹配_C#_Winforms - Fatal编程技术网

C# HandleDestroyed和HandleCreated不匹配

C# HandleDestroyed和HandleCreated不匹配,c#,winforms,C#,Winforms,在我的C#项目中,我有一个静态类,它跟踪一些文本框。需要从列表中删除文本框以防止内存泄漏 我有一个静态函数,可以向列表中添加一个文本框: public static void Add(TextBox tb) { tb.HandleCreated += new EventHandler(TextBoxHandleCreated); } static void TextBoxHandleCreated(object sender, EventArgs e) { TextBox t

在我的C#项目中,我有一个静态类,它跟踪一些文本框。需要从列表中删除文本框以防止内存泄漏

我有一个静态函数,可以向列表中添加一个文本框:

public static void Add(TextBox tb)
{
    tb.HandleCreated += new EventHandler(TextBoxHandleCreated);
}

static void TextBoxHandleCreated(object sender, EventArgs e)
{
     TextBox tb = sender as TextBox;
     tb.HandleDestroyed += new EventHandler(OnHandleDestroyed);

     tbList.Add(tb);
}

static void OnHandleDestroyed(object sender, EventArgs e)
{
    // Remove it
    Remove(sender as Control);
}
我从我的
表单
上的
用户控件的构造函数中调用add函数。在remove函数中,我调用
c.HandleDestroyed-=OnHandleDestroyed因此,出于这个原因,我不让控件保持活动状态

Remove
功能是一个简单的检查和删除循环:

public static void Remove(Control c)
{
    foreach (Control cl in cList)
    {
        if (c.Equals(cl))
        {
            c.HandleDestroyed -= OnHandleDestroyed;
            cList.Remove(cl);
            //break;
        }
    }
}
问题是,当我的对话框显示并销毁时,我希望创建和销毁的对话框匹配,但事实并非如此。我创造的比破坏的多


为什么会这样?

Remove方法看起来像什么?没有简单的解释,除了忘记显式处理对话框表单之外,这是一个非常常见的疏忽。或使用控件的对话框窗体代码。删除或删除控件。在不处理删除的控件的情况下清除,这是一个致命的疏忽。您的代码片段太不完整,无法尝试重现问题。使用调试器,你有对未被破坏的文本框的引用,所以找出它发生了什么。是的,我确实发现了一个可疑的控件。清除并修复了大部分内存泄漏。谢谢你的提示。