【问题标题】:Adding a user control "The Enumerator is not valid"添加用户控件“枚举器无效”
【发布时间】:2012-08-12 22:56:15
【问题描述】:

我正在使用 Visual Studio 2010 创建一个小型 WPF 应用程序。我创建了一个用户控件,我现在正尝试将它添加到我的主窗体中。用户控件确实显示在工具箱中,但每次我尝试将控件拖动到表单时都会出现错误:

枚举数无效,因为集合已更改。

我应该知道出了什么问题,但我无法弄清楚这件事让我烦恼。

【问题讨论】:

    标签: wpf visual-studio-2010 user-controls


    【解决方案1】:

    您在用户控件的构造函数中存在错误 - 您在 IEnumerable 上使用了 foreach 循环,并且在循环运行时,IEnumerable 被更改,这在 foreach 循环中是不允许的。如果您正在操作您正在迭代的集合,请改用 for 循环。

    【讨论】:

    • 我没有使用 for 循环来添加控件。我有一个不同的控件,它工作得很好。我可以添加该控件的多个实例 这是工具箱中的单个控件,我只是想将其拖到窗体中。
    • 我没有说你使用循环来添加控件,我说你在那个用户控件的构造函数中使用了循环。将ctor拖入设计器后会调用它。
    • 谢谢,抱歉。想通了。需要一个不带参数的构造函数,然后它就可以工作了。
    【解决方案2】:

    这里的问题是你不知道是什么代码抛出了异常。

    WPF 对异常的处理很糟糕,尤其是在构造函数中。该框架坚持捕获并重新抛出一个新异常,通常是多次,并且很难找到原始堆栈跟踪。我发现追踪此类错误的最简单方法是在抛出异常后立即告诉 Visual Studio 停止,而不是等到 WPF 重新抛出它几次并让细节难以挖掘出去。

    我面前没有 Visual Studio 2010,但下面是在 VS2008 中执行此操作的方法——2010 可能类似:

    • 转到“调试”菜单 > 例外...
    • 在“Common Runtime Language Exceptions”旁边,选中“Thrown”列中的复选框

    然后再次调试您的应用。它将停在实际导致问题的线路上,并且您会更容易看到发生了什么。如果你仍然不确定它为什么会抛出异常,你可以发布一个代码示例。

    【讨论】:

    • VS 抛出错误。有些东西告诉我我错过了一个关键步骤。该控件是我项目的一部分,属于同一个命名空间。主编一直在抱怨它。就像测试一样,我在主窗体中添加了一个堆栈面板并转到代码隐藏,我能够毫无意外地将控件添加到堆栈面板。
    • 您可以随时使用 VS 调试另一个 VS 实例。或者开始注释你的代码,直到它不再给你错误。
    • 我想我明白了。我转到 XAML 代码并尝试使用 手动输入我的控件。然后下一个构建失败,因为控件没有一个带零参数的构造函数。我修改了我的控件,使构造函数的参数为​​零,它工作得很好。
    【解决方案3】:

    为了使用户控件正常运行,您需要有一个带零参数的构造函数。这样,表单设计者就有办法以“默认”方式呈现控件。

    然后,我重载了构造函数以获取正确运行控件所需的参数,并且一切都按预期工作。

    【讨论】:

      【解决方案4】:

      你需要:

      1. 删除 DLL 引用
      2. 添加对控件的引用
      3. 重建解决方案
      4. 添加您的控件。它应该可以工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 2011-04-25
        相关资源
        最近更新 更多