26

在 VS2010 中,我有一个针对 .NET Framework 4.0 的项目,然后不得不恢复到目标 v. 3.5。一旦发生这种情况,我拥有的 SplitContainer 对象将不会显示,实际上会引发错误:“无法将 'System.Windows.Forms.SplitContainer' 类型的对象转换为 'System.ComponentModel.ISupportInitialize' 类型。”

现在,我进行了一些挖掘,发现 3.5 实际上并没有在 SplitContainer 上具有 ISupportInitialize,而在 .NET 4.0 中却有。我想我的问题是,如果我的目标是 3.5 并且仍然遇到这个问题,我该如何纠正这个问题?

重现问题的步骤:

  1. 在 Visual Studio 2010 中创建一个新的 C# Windows 窗体应用程序项目(确保以 .NET Framework 4.0 为目标)
  2. 将拆分容器添加到基本表单。
  3. 运行应用程序(运行良好)
  4. 将目标更改为 .NET Framework 3.5(属性->应用程序->目标框架:)
  5. 重新运行应用程序(它将因 Cast 异常而崩溃)。

对此的任何帮助将不胜感激!

4

3 回答 3

33

我找到了解决这个问题的方法,它非常特别......如果你将表单返回到 3.5,你必须对程序中的每一个表单做一个小的改动,以便编译器重新生成所有代码对于那个表格。我遇到问题的原因是我没有进行任何更改并且试图运行尚未重新生成的代码。

于 2011-05-17T15:19:39.707 回答
6

正如@tomash 提到的那样,删除该特定控件上的 BeginInit() 和 EndInit() 行就足够了。

SplitContainer.BeginInit

.NET Framework 支持:4.5、4

单击此处了解有关此方法的更多信息。

于 2014-11-27T12:45:01.577 回答
2

这是一篇旧帖子,但我不喜欢每次都编辑设计器文件,给错误留下了太多空间。

我只是对控件进行了子类化,并使用预处理器指令实现了 .net 3.5 构建的接口,如下所示。

在寻找解决方案时,只需添加我的方法,因为这篇文章于 2017 年出现。

    /// <summary>
    /// Split Container Control
    /// </summary>
    public class SplitContainer : System.Windows.Forms.SplitContainer

#if (NET35)
        , ISupportInitialize
#endif

    {
        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        public SplitContainer() : base() { }

        #endregion Constructor

        #region ISupportInitialize Methods

#if (NET35)

        public void BeginInit() { }

        public void EndInit() { }

#endif

        #endregion ISupportInitialize Methods
    }
于 2017-08-23T13:41:24.010 回答