简体   繁体   中英

How to prevent VisualStudio designer from adding BeginInit and EndInit methods to code?

When visual studio designer adds the following lines to the code, my app UI undergoes some undesirable displacement.

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

How can I prevent it?


Edition:

I created a new simple project with only two nested SplitContainer s and encountered the same issue.

Problem:

As it's been marked in the following code, SplitterWidth of splUpperSection remains unchanged! If you remove BeginInit and EndInit methods, this property ( SplitterWidth ) will be changed! Is it a farmework BUG???

The InitializeSplitContainers method contains exactly the code that Visual Studio designer generates automatically. You also can simply create a new Form and add two nested split containers to it which have a SplitterWidth of 1 to touch the problem easily.

Code:

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);
        }
    }
}

Workaround:

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

These calls are required to inform to the this.splitContainer1 object that all the initialization has been done to avoid having to enter object property values in a specified order.

Only when you call EndInit the values of the properties are evaluated.

Said that, this should not displace your UI in anyway if the values you set on the object proeprties does not displace the object.

EDIT: The only thing that happens when calling EndInit() is the container executing the following methods:

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);
}

So your problem has to be related with one or more of these 3 properties.

I got this error when I merged changes back from a working project which was migrated from 2010 to 2015. In the Updated Project the 2 new lines were added in the designer something like:

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

and

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

If I ran the version running on 2015, it ran without issues.

To resolve this in VS 2010, I deleted both of these lines . After that the project has been working fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM