Squeak.ru - шаблоны программирования

Как запретить конструктору VisualStudio добавлять в код методы BeginInit и EndInit?

Когда дизайнер Visual Studio добавляет в код следующие строки, пользовательский интерфейс моего приложения подвергается нежелательному смещению.

((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
:
:
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();

Как я могу предотвратить это?


Издание:

Я создал новый простой проект только с двумя вложенными SplitContainer и столкнулся с той же проблемой.

Проблема:

Как отмечено в следующем коде, SplitterWidth из splUpperSection остается неизменным! Если вы удалите методы BeginInit и EndInit, это свойство (SplitterWidth) будет изменено! Это ошибка фермы???

Метод InitializeSplitContainers содержит именно тот код, который конструктор Visual Studio генерирует автоматически. Вы также можете просто создать новую форму и добавить в нее два вложенных разделенных контейнера, которые имеют SplitterWidth из 1, чтобы легко решить проблему.

Код:

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace TestApp
{
    public partial class Form1 : Form
    {
        //
        // SplitContainers
        //
        private SplitContainer splBase;
        private SplitContainer splUpperSection;

        /// <summary>
        /// The form has initially no child control.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            InitializeSplitContainers();
        }

        private void InitializeSplitContainers()
        {
            this.splBase = new SplitContainer();
            this.splUpperSection = new SplitContainer();
            ((ISupportInitialize)(this.splBase)).BeginInit();
            this.splBase.Panel1.SuspendLayout();
            this.splBase.SuspendLayout();
            ((ISupportInitialize)(this.splUpperSection)).BeginInit();
            this.splUpperSection.SuspendLayout();
            this.SuspendLayout();
            // 
            // splBase
            // 
            this.splBase.BackColor = Color.Red;
            this.splBase.Dock = DockStyle.Fill;
            this.splBase.FixedPanel = FixedPanel.Panel1;
            this.splBase.IsSplitterFixed = true;
            this.splBase.Location = new Point(0, 0);
            this.splBase.Name = "splBase";
            this.splBase.Orientation = Orientation.Horizontal;
            // 
            // splBase.Panel1
            // 
            this.splBase.Panel1.Controls.Add(this.splUpperSection);
            // 
            // splBase.Panel2
            // 
            this.splBase.Panel2.BackColor = Color.White;
            this.splBase.Size = new Size(400, 400);
            this.splBase.SplitterDistance = 115;
            this.splBase.SplitterWidth = 1;
            this.splBase.TabIndex = 0;
            // 
            // splUpperSection
            // 
            this.splUpperSection.BackColor = Color.Chartreuse;
            this.splUpperSection.Dock = DockStyle.Fill;
            this.splUpperSection.FixedPanel = FixedPanel.Panel1;
            this.splUpperSection.IsSplitterFixed = true;
            this.splUpperSection.Location = new Point(0, 0);
            this.splUpperSection.Name = "splUpperSection";
            this.splUpperSection.Orientation = Orientation.Horizontal;
            // 
            // splUpperSection.Panel1
            // 
            this.splUpperSection.Panel1.BackColor = Color.White;
            // 
            // splUpperSection.Panel2
            // 
            this.splUpperSection.Panel2.BackColor = Color.White;
            this.splUpperSection.Size = new Size(400, 115);
            this.splUpperSection.SplitterDistance = 25; // ←Will be set
            this.splUpperSection.SplitterWidth = 1;     // ←Won't be set (stays: 4)
            this.splUpperSection.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new SizeF(6F, 13F);
            this.AutoScaleMode = AutoScaleMode.Font;
            this.ClientSize = new Size(400, 400);
            this.Controls.Add(this.splBase);
            this.Name = "Form1";
            this.Text = "Bug Form";
            this.splBase.Panel1.ResumeLayout(false);
            ((ISupportInitialize)(this.splBase)).EndInit();
            this.splBase.ResumeLayout(false);
            ((ISupportInitialize)(this.splUpperSection)).EndInit();
            this.splUpperSection.ResumeLayout(false);
            this.ResumeLayout(false);
        }
    }
}

Временное решение:

public Form1()
{
    //
    // Initializing components including split-containers..
    //
    InitializeComponent();
    {
        //
        // keeping initializing on..
        //
        splBase.SplitterWidth = 1;
        splUpperSection.SplitterWidth = 1;
    }
}

  • Можете ли вы подтвердить, что это веб-сайт, а не winform. Похоже, ваш CSS нуждается в исправлении, а не в коде дизайнера VS, это происходит, когда вы редактируете код дизайнера: stackoverflow.com/questions/4548316/ 26.04.2012
  • Это приложение winform и не имеет CSS. 26.04.2012
  • Спасибо @JeremyThompson за добавление тега winforms. 26.04.2012
  • +1 просто к сведению: вы можете попробовать hawkeye.codeplex.com для настройки свойств формы во время выполнения , то как только вы поймете, как бороться с нежелательным смещением, добавьте необходимый код после InitComponent() 27.04.2012
  • +1 Спасибо @Jeremy. Что вы думаете об этом вопросе? 27.04.2012
  • какие строки кода мы включаем или закомментируем, чтобы воспроизвести проблему с приведенным выше кодом? какая разница, что кода нет в файле Designer.cs? Я поиграл с этим, но не уверен, как будет выглядеть проблема в этом базовом проекте. 27.04.2012
  • Вопрос был снова отредактирован, чтобы быть более понятным 27.04.2012
  • Как решить эту проблему? 27.09.2018

Ответы:


1

Эти вызовы необходимы для информирования объекта this.splitContainer1 о том, что вся инициализация выполнена, чтобы избежать необходимости вводить значения свойств объекта в указанном порядке.

Только при вызове EndInit значения свойств оцениваются.

Сказал, что это никоим образом не должно смещать ваш пользовательский интерфейс, если значения, которые вы устанавливаете для свойств объекта, не смещают объект.

РЕДАКТИРОВАТЬ: Единственное, что происходит при вызове EndInit(), — это контейнер, выполняющий следующие методы:

if (this.newPanel1MinSize != this.panel1MinSize)
{
    this.ApplyPanel1MinSize(this.newPanel1MinSize);
}
if (this.newPanel2MinSize != this.panel2MinSize)
{
    this.ApplyPanel2MinSize(this.newPanel2MinSize);
}
if (this.newSplitterWidth != this.splitterWidth)
{
    this.ApplySplitterWidth(this.newSplitterWidth);
}

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

26.04.2012
  • Но когда я их удаляю, все становится ок. В чем может быть причина? 26.04.2012
  • Вероятно, потому что без вызова EndInit некоторые значения свойств не оцениваются или оцениваются в другом порядке. Не могли бы вы вставить код или изображения? 26.04.2012
  • Я удаляю BeginInit и EndInit одновременно. Любая другая идея? 26.04.2012
  • Если объект реализует ISupportInitialize (см. здесь: msdn.microsoft. com/es-es/library/) означает, что он, вероятно, нужен. Может ли быть дело в управлении? Если это элемент управления фреймворком, скажите мне, какой именно, если нет, попробуйте декомпилировать его самостоятельно, чтобы посмотреть, что он делает, когда вы вызываете EndInit. 26.04.2012
  • Я добавил схему документа рис. 26.04.2012
  • Какую версию .Net вы используете? Похоже, что SplitContainer не реализует ISupportInitialize в .Net 2 и 3. 26.04.2012
  • Я столкнулся с этой проблемой в .Net 3.5 и 4.0! 26.04.2012
  • +1 Ты прав @SoMoS. Я проверил это снова. И SplitterWidth, и Panel1MinSize были установлены (изменены), но после вызова EndInit SplitterWidth не будет установлено, а Panel1MinSize будет установлено!! Отсутствие установки SplitterWidth приводит к смещению. Но почему? Почему не ставится??? 26.04.2012
  • +1 Спасибо за информацию. Я отредактировал свой вопрос. Не могли бы вы взглянуть на это? 27.04.2012

  • 2

    Я получил эту ошибку, когда я объединил изменения обратно из рабочего проекта, который был перенесен с 2010 на 2015 год. В обновленном проекте в дизайнере были добавлены две новые строки, например:

            ((ISupportInitialize)(this.splBase)).BeginInit();
    

    и

            ((ISupportInitialize)(this.splBase)).EndInit();
    

    Если я запускал версию, работающую в 2015 году, она работала без проблем.

    Чтобы решить эту проблему в VS 2010, я удалил обе эти строки. После этого проект работал нормально.

    06.01.2018
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...