hired777
hired777

Reputation: 495

Scrollbar visibility

I write simply code:

namespace Test01
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.button3 = new System.Windows.Forms.Button();
            this.button4 = new System.Windows.Forms.Button();
            this.panel1.SuspendLayout();
            this.SuspendLayout();
            // 
            // panel1
            // 
            this.panel1.AutoScroll = true;
            this.panel1.Controls.Add(this.button4);
            this.panel1.Controls.Add(this.button3);
            this.panel1.Controls.Add(this.button2);
            this.panel1.Location = new System.Drawing.Point(24, 13);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(206, 43);
            this.panel1.TabIndex = 0;
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(89, 62);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(3, 3);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(75, 23);
            this.button2.TabIndex = 2;
            this.button2.Text = "button2";
            this.button2.UseVisualStyleBackColor = true;
            // 
            // button3
            // 
            this.button3.Location = new System.Drawing.Point(84, 3);
            this.button3.Name = "button3";
            this.button3.Size = new System.Drawing.Size(75, 23);
            this.button3.TabIndex = 3;
            this.button3.Text = "button3";
            this.button3.UseVisualStyleBackColor = true;
            // 
            // button4
            // 
            this.button4.Location = new System.Drawing.Point(165, 3);
            this.button4.Name = "button4";
            this.button4.Size = new System.Drawing.Size(75, 23);
            this.button4.TabIndex = 4;
            this.button4.Text = "button4";
            this.button4.UseVisualStyleBackColor = true;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(251, 98);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.panel1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.panel1.ResumeLayout(false);
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Button button4;
        private System.Windows.Forms.Button button3;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.Button button1;
    }
}

And:

namespace Test01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Controls.Remove(button4);
        }
    }
}

I run it and have following results:

Sample

At first column i just press button1 - it works as expected.

At second column i move scrollbar and press button1 - button4 disappeared, but scrollbar still exist. When i folded and unfolded window scrollbar disappered.

At third column i turn on classic theme and just press button1 - all OK.

I have read stackoverflow1 stackoverflow2 stackoverflow3 and try to use validate, invalidate, update, refresh - but it didn`t help. So, how could i fix this problem?

Upvotes: 4

Views: 2902

Answers (3)

Antagony
Antagony

Reputation: 1780

Reset the scrollbar's position to zero before removing the button:

    private void button1_Click(object sender, EventArgs e)
    {
        panel1.HorizontalScroll.Value = 0;
        panel1.Controls.Remove(button4);
    }

Edit

I've since found this method doesn't always work when the scrollbar's value is zero. I've tried various methods to force it to always clear the scrollbar, but the only thing that seems to work reliably is setting its value to 1 then 0 before removing the button:

        panel1.HorizontalScroll.Value = 1;
        panel1.HorizontalScroll.Value = 0;
        panel1.Controls.Remove(button4);

It's ugly but it seems to work. I'd personally count this as a bug in the framework.

Upvotes: 3

Jake
Jake

Reputation: 302

Try invoking the refresh method by BeginInvoke, so that it re-enters the window loop:

this.BeginInvoke((Action)scrollBar.PerformLayout);

Calling it from the current method (without invoke) sometimes avoids re-rendering.

Upvotes: 0

LarsTech
LarsTech

Reputation: 81675

Try replacing your panel with a FlowLayoutPanel instead. Use the same size as the panel you are replacing. On the FlowLayoutPanel control, set the AutoScroll = True and the FlowDirection = TopDown.

The panel should move the controls for you and you also won't have to worry about the scrollbar either.

Upvotes: 1

Related Questions