Move contents of Form when a Control is re

Let's just say that I have many controls on my Form, and when a User clicks on one of them, its height will expand. This means that, currently, when this clicked-control expands, other controls below it will become overlapped by the expanded control.

But what I want to happen, is for each Control below the expanded control to slide down, so that they are below the expanded control again.

I know how to handle sliding, but I just don't know how to make every control except for one move everytime a given control is moved.

Any help at all is greatly appreciated, thank you!

This is what I was thinking:

void newOrderReceived(object sender, EventArgs e)
{
    foreach(Control OrderNotificationBox in OrdersPanel.Controls)
    {
        if(OrderNotificationBox is NotificationBox) // Checks to see if the control is a NotificationBox
        {
            // Add my code to slide controls down.
        }
    }
}

But... How do I know if the control is below the expanded control?

Is this how I should go about changing the location of all controls below the expanded control?

Edit: Just had a thought, to check to see if a NotificationBox is below the Expanded NotificationBox, see revised code below:

void newOrderReceived(object sender, EventArgs e)
{
    foreach(Control OrderNotificationBox in OrdersPanel.Controls)
    {
        if(OrderNotificationBox is NotificationBox) // Checks to see if the control is a NotificationBox
        {
            if(OrderNotificationBox.Location.Y <= ExpandedNotificationBox.Location.Y + ExpandedNotificationBox.Size.Width)
            {
                // Add my code to slide controls down.
            }
        }
    }
}

But would this be sufficient? Currently, this is working, so I guess I just answered my own question. But, isn't there a better way to do this? A more elegant/efficient way?

Here's a sample of how it should look:


FlowLayoutPanel provides you with dynamic layout where you can resize any control in it and all below controls will slide automatically. There are many strategies to using groups/columns of flow layout panels to be able to achieve the desired look for the whole form. Some googling will reveal some of these.

For instance in the form above, resizing the button1 control simply flows all the below controls to further down on the form. You can try that at the design time also. Drop the form a flow layout panel, drop 3-4 control in the container and start experimenting..


For each expandable content use Panel.
Dock your panels one under another (Use panel1.Dock = DockStyle.Top . For the very bottom panel use panel1.Dock = DockStyle.Fill ).
Place your child controls inside of each expandable panel, set inner controls' Anchor properties accordingly.
When you expand one panel, the rest of the panels will adjust automatically. You don't need to code for this. You will only change Height of a panel that you currently expand.


What you need is some kind of 'ExplorerBar' functionality. There are several control libraries that offer that, and I found the article here on the CodeProject that has it for free.

链接地址: http://www.djcxy.com/p/58372.html

上一篇: 如何在更改表单大小时更改文本框的位置

下一篇: 在重新控制时移动表单的内容