【问题标题】:Cannot Place User Control on Form无法在表单上放置用户控件
【发布时间】:2011-06-15 13:59:47
【问题描述】:

我使用 VS2010 创建了一个 C# WinForms 应用程序。我是创建用户控件的新手,所以我创建了一个新的用户控件(作为同一项目的一部分)。

当我重建项目时,新控件出现在工具箱中。当我将控件从工具箱拖到窗体上时,出现以下错误。

未能加载工具箱项“TagGroup”。它将从工具箱中移除。

这也是我唯一一次创建用户控件时发生的。我在网上搜索过,但我发现的大多数答案似乎都与将控件放在单独的程序集中有关。 (请注意,我发现很多问题与我遇到的相同问题。)

谁能建议我接下来应该看哪里?

【问题讨论】:

  • 这将有助于显示一些代码。至少向我们展示类声明和构造函数,尽管整个类最有帮助。
  • 隔离这个。当一个没有任何内容的普通 UserControl => VS 问题时是否会发生这种情况。没问题 => 注意在设计时运行的代码。
  • 你在构造函数中做了什么吗? IIRC,设计师会调用它,所以最好不要有任何外部调用的东西。
  • @Mathew:没有代码!我解释了我做了什么。没有别的了。
  • @Hans:这与代码无关,只是为了消除所有疑问,我创建了另一个用户控件,除了重建项目之外什么也没做。结果完全相同。如前所述,这已经发生过。它从来没有为我工作过。

标签: c# .net winforms user-controls


【解决方案1】:

我的应用程序需要是 64 位的。为了在设计器中使用自定义用户控件,我刚刚在我的解决方案中添加了一个新项目。这个新项目使用“AnyCPU”设置并包含我所有的用户控件。

我的解决方案包含以下项目:

  • MyApp 这是我在 64 位 编译的主要项目(Windows 窗体应用程序)并引用了我的第二个项目
  • MyApp.UI.UserControls(类库)针对“Any CPU”编译并包含我所有的用户控件

像魅力一样工作,而且很干净


顺便说一句,有一个关于这个问题的Microsoft support article

  • 行动:您尝试在 Microsoft Visual Studio 集成开发环境 (IDE) 中使用 64 位组件。
  • 错误原因:此行为是设计使然。 Visual Studio 是一个 32 位进程,因此只能执行 32 位模块。虽然 Visual Studio 允许您添加对 64 位程序集的引用,但它实际上无法将其 JIT 编译为 64 位并在进程中执行它。
  • 解决方案:
    1. 使用“AnyCPU”设置重建程序集。这将允许 要在 32 位进程中运行的组件(例如 Visual Studio),或在 64 位进程中。
    2. 将程序集添加为引用并在以下位置动态加载控件 运行。虽然您仍然无法使用 在 Visual Studio 中的任何设计器中进行控制,您仍然可以 编写实例化控件所需的代码并将其设置为 相应的属性。

来源: http://support.microsoft.com/kb/963017

【讨论】:

  • 可悲的是,我的应用程序和所有控件都必须是 x64 的,因为它们使用的是本机类型 :( 他们真的应该制作 VS x64!
  • 是的!!!我别无选择,只能在我的 AutoCAD 版本中使用 x64。以前的解决方案不起作用!此外,在这种崩溃和燃烧之前,如果我必须对给定的表格进行修改,我必须进入设计师并对其进行调整……每次。这完美无缺!是的!
  • 作为一个警告,这个 x64 / 用户控件问题可能是由一些简单的事情引起的,例如用户控件上的一个字段设置为从 64 位程序集加载的 常量 ; 最好不要在 UserControl 上使用 x64 dll 中的任何内容。
【解决方案2】:

我终于想通了。

我正在处理的项目使用两个类库程序集。虽然这些与我正在讨论的控件无关,但我查看并看到两个库在属性|构建选项卡中都将平台目标设置为“任何 CPU”。

另一方面,我的应用程序将此设置设置为“x64”。通过将我的应用程序设置更改为“任何 CPU”,我现在可以将用户控件放置到我的表单上。

去看看……

【讨论】:

  • 完全奇怪这种特殊症状是如何源于这个问题的,但它也对我有用!谢谢。 +1
  • 请注意,如果类库中的.NET框架与控件高于您的项目,也会发生同样的事情。不允许这样做是有道理的,但 IDE 应该只说“嘿,此控件位于 .NET 4.5.1 dll 中 - 从 .NET 4.5 升级您的项目”,而不是静默失败。
【解决方案3】:

我也有这个问题,但答案不适合我。我的项目有一些问题,它只能分别针对 x86 和 x64。换句话说,我不能使用 AnyCPU 配置(这是因为我为每个配置引用了不同的库,因为这些库不适合 AnyCPU)。

我想出的解决方案是:当我需要使用表单设计器时,我将设置更改为 x86。完成这项工作,然后设置回 x64 并进行测试。问题只出现在设计者身上,但解决方案构建并运行良好。

【讨论】:

    【解决方案4】:

    我在VS2015中遇到了这个问题,结果证明很简单。

    我通过从表单中剪切和粘贴一些现有控件来创建用户控件(目的是将它们分组到自定义控件中)。自定义控件没问题(没有编译错误),但是从现有表单中删除控件意味着应用程序无法编译。当然,无法添加新控件意味着我无法使用引用自定义控件的代码更新引用先前控件的代码。

    我所做的只是修改和斜线(注释掉、创建临时控件等),以便整个应用程序能够编译。编译后我发现我可以将自定义控件拖到表单上(没有提示此问题的错误)。然后我不得不取消修改和取消斜线,以便代码正确引用新的自定义控件。

    【讨论】:

    • 为我工作,使用 x86 配置重新编译,现在可以添加用户控件。
    • 这个!如果您在第一次删除它时遇到构建错误,问题将一直存在,直到您成功进行干净的重建。
    【解决方案5】:

    同样的问题。我猜测这与安装在x64 OS上的VS2010仍然是一个32位的程序有关。

    人们可能想要尝试的另一种解决方案是简单地打开 TheFormThisUserControlIsSupposedToBeAddedTo.Designer.cs 并使用代码添加用户控件。基本上,您正在做设计师应该做的肮脏工作。

    这并不像听起来那么难,尤其是。考虑到该文件中可能已经有大量示例代码(例如,您使用 Designer 添加的按钮)。唯一困难的部分是在表单中找出正确的坐标来放置控件。

    最终结果是在 Desinger 中看不到用户控件,但它们是在调试/运行时添加的。

    【讨论】:

    • 我认为 Visual Studio 的“位”与此无关。 VS 仍然可以生成 64 位可执行文件。我认为这与我从不同项目中获取组件的事实更相关,这些项目显然使用了不同的设置。
    【解决方案6】:

    我也遇到过这个问题,但原因不同。在我的例子中,组件(表单)构造函数或 Load 事件在其他地方调用了一个方法,该方法使用反射来查找实现某个接口的所有类。

    虽然它在运行时运行良好,但它在设计时产生了上述异常。 (将类型加载异常作为内部异常的类型初始化异常)。

    【讨论】:

      【解决方案7】:

      凌晨 3:36 进行了一个小时的困惑、疲惫的故障排除,第二天又以全新的思维轻松解决了!
      我修复了控件文件名中的一个简单拼写错误,因此它现在与 UserControl 名称匹配,清理并重新构建并 Bobs 你奇怪的叔叔的猫。 :]

      【讨论】:

        【解决方案8】:

        转到项目属性,然后选择“构建”选项卡并检查“目标平台”是否为“AnyCPU”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-30
          • 1970-01-01
          相关资源
          最近更新 更多