Проблема SplitContainer ISupportInitialize: VS2010 Targeting .NET 3.5

В VS2010 у меня был проект, ориентированный на .NET Framework 4.0, и затем мне пришлось вернуться к целевой версии 3.5. Как только это произошло, объект SplitContainer, который у меня был, не будет отображаться и фактически выдаст ошибку: «Невозможно преобразовать объект типа 'System.Windows.Forms.SplitContainer' в тип 'System.ComponentModel.ISupportInitialize'».

Теперь, покопавшись, я обнаружил, что в 3.5 на самом деле нет ISupportInitialize в SplitContainer, а в .NET 4.0 он есть. Думаю, у меня такой вопрос: если я ориентируюсь на 3.5 и все еще получаю эту проблему, как мне это исправить?

Шаги по воспроизведению проблемы:

  1. Создайте новый проект C # Windows Forms Application в Visual Studio 2010 (убедитесь, что выбрана платформа .NET Framework 4.0)
  2. Добавьте разделенный контейнер в основную форму.
  3. Запустите приложение (все будет нормально)
  4. Измените цель на .NET Framework 3.5 (свойства-> Приложения-> Целевая платформа :)
  5. Перезапустите приложение (оно выйдет из строя с исключением Cast).

Любая помощь с этим будет принята с благодарностью!


person Austin    schedule 09.05.2011    source источник


Ответы (3)


Я нашел решение этой проблемы, и оно было совершенно особенным ... ЕСЛИ вы вернули свои формы на 3.5, вам нужно внести небольшие изменения в КАЖДУЮ И КАЖДУЮ форму, которая есть в вашей программе, чтобы компилятор регенерировал весь код для этой формы. Причина, по которой у меня возникла проблема, заключалась в том, что я не внес никаких изменений и пытался запустить код, который не был восстановлен.

person Austin    schedule 17.05.2011
comment
Вы только что прокомментировали BeginInit () и EndInit () при инициализации компонента? Спасибо - person sw.; 02.06.2011
comment
Следуйте инструкциям из исходного сообщения, затем попробуйте запустить его. Это не удастся. Тогда вы можете просто добавить кнопку в свою форму. Удалите эту недавно добавленную кнопку, а затем повторно запустите приложение. Альт! приложение работает! Это связано с тем, что приложение не регенерировало данные формы до тех пор, пока вы не измените форму, добавив или удалив компонент. тогда Visual Studio полностью регенерирует код этой формы в соответствии с требованиями Framework 3.5. Просто раздражен, что они не делают этого автоматически, когда ты возвращаешься ... облегчило бы мою работу ›‹ - person Austin; 03.06.2011
comment
как @sw. написал, достаточно найти и удалить строчки типа ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - person tomash; 23.01.2012
comment
Да, похоже, что это критическое изменение при открытии элемента управления в vs2010 (что отстой). Мое решение было таким же, найти все EndInit и BeginInit и удалить их. - person Dinis Cruz; 25.06.2012
comment
Это действительно помогло мне с Visual Studio 2012. Открыл конструктор, переместил компонент на 1 пиксель влево, затем на 1 пиксель вправо, сохранил и запустил. Проголосовали! - person poudigne; 08.05.2013
comment
Будет ли это (повторный факторинг) также работать, если вы использовали VS Express 2013 для проекта .net 4.5 для библиотеки элементов управления и использовали эту библиотеку элементов управления в проекте VS 2010 .net 3.5. Сложность, с которой я столкнулся, заключается в том, что это элемент управления, а не форма, поэтому добавить кнопку удаления нетривиально. - person fkl; 30.04.2014
comment
Вы, наверное, сэкономили мне много времени. Спасибо. - person Himanshu Jansari; 13.07.2021

Как упоминалось в @tomash, для удаления строки BeginInit () и EndInit () на этом конкретном элементе управления достаточно.

SplitContainer.BeginInit

.NET Framework Поддерживается в версиях: 4.5, 4

Щелкните здесь для получения дополнительной информации об этом методе.

person Lex van Buiten    schedule 27.11.2014

Это старый пост, но мне не нравилось каждый раз редактировать файлы дизайнера, оставляя слишком много места для ошибок.

Я просто разделил элемент управления на подклассы и реализовал интерфейс для сборок .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
    }
person WraithNath    schedule 23.08.2017
comment
У меня была эта проблема с пользовательским компонентом в Visual Studio 2019 .NET 4.6.2. Решение WraithNath сработало для моего компонента. Спасибо! - person gridtrak; 22.05.2019
comment
Это решение отлично подходит для меня. Вам не всегда нужно настраивать класс дизайнера, если что-то было изменено в пользовательском интерфейсе. - person Hank; 28.01.2021