SplitContainer ISupportInitialize问题:VS2010定位.NET 3.5

26
在VS2010中,我有一个项目的目标是.NET Framework 4.0,但后来不得不改为目标版本为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 Forms应用程序项目(确保目标为.NET Framework 4.0)。 2. 将一个SplitContainer添加到基本表单中。 3. 运行应用程序(可以正常运行)。 4. 更改目标为.NET Framework 3.5(属性->应用程序->目标框架:)。 5. 重新运行应用程序(它将因转换异常而崩溃)。
希望能得到任何关于此问题的帮助和支持!
3个回答

33

我找到了解决这个问题的方法,它非常特别... 如果你将表单回滚到3.5版本,你需要对程序中的每个表单进行一个小改变,以便编译器重新生成该表单的所有代码。我遇到问题的原因是我没有进行任何更改并尝试运行代码,但代码没有被重新生成。


2
你只是在组件初始化时注释了BeginInit()和EndInit()吗?谢谢。 - sw.
6
按照原帖的步骤操作,然后尝试运行它。它会失败。接下来您可以在表单中添加一个按钮。删除新添加的按钮,然后重新运行应用程序。哇!应用程序可以正常工作了!这是因为直到您通过添加或删除组件修改表单时,应用程序才会重新生成表单数据。那时,Visual Studio将完全重新生成该表单的代码以匹配Framework 3.5的要求。只是有点烦人的是,当您回退版本时,它们不会自动执行...如果这样做,我的工作会更加容易 >< - Austin
3
如@sw.所写,只需查找并删除类似于((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();的行即可。 - tomash
是的,看起来在vs2010中打开控件时有一个破坏性变化(很糟糕)。我的解决方案也是一样的,找到所有的EndInit和BeginInit并将它们删除。 - Dinis Cruz
3
这实际上对我在Visual Studio 2012中的使用有所帮助。打开设计器,将一个组件向左移动1像素,然后向右移动1像素,保存并运行。点赞! - poudigne
显示剩余2条评论

6

正如@tomash所提到的那样,只需删除该特定控件上的BeginInit()和EndInit()即可。

SplitContainer.BeginInit

.NET Framework支持: 4.5, 4

单击此处获取有关此方法的更多信息。


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
    }

我在Visual Studio 2019 .NET 4.6.2中使用自定义组件时遇到了问题。WraithNath的解决方案对我的组件有效。谢谢! - gridtrak
这个解决方案对我非常有效。 如果UI上有变化,你并不总是需要调整设计师类。 - Hank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接