Reputation: 495
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:
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
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
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
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