dolfijn3000 Ответов: 3

Сдвинуть все мои элементы управления на самый верх панели ?


Привет, я сделал свой контроль аккордеона.

код:
class Acordion : Panel
    {


        Panel panel = new Panel();
        int Y;

        public Acordion(int x, int y, int sizeX,int sizeY)
        {
            this.Location=  new Point(x, y);
            this.Size = new Size(sizeX,sizeY);

            Button expandButton = new Button();
            expandButton.Location = new Point(0,0);
            expandButton.Size = new Size(sizeX,20);
            expandButton.Click += (s, e) => { Expand(); };

            
            panel.Location = new Point(0,0);
            panel.Size = new Size(sizeX,100);

            TextBox textBox = new TextBox();
            textBox.Location = new Point(0,expandButton.Size.Height + 10);
            textBox.Size = new Size(sizeX, 10);

            textBox.BringToFront();

            this.Controls.Add(expandButton);
            this.Controls.Add(panel);
            panel.Controls.Add(textBox);

            Y = panel.Height;

        }
        public void Expand()
        {
            if (panel.Height != 0)
            {
                panel.Height = 0;
            }
            else
            {
                panel.Height = Y;
            }
        }

    }


этот код работает почти так, как я хочу, чтобы он вел себя. в настоящее время, когда вы нажимаете кнопку, Панель под ней исчезает, потому что ее размер установлен на 0.
Но другие элементы управления под ним не двигаются вверх.

так что на этой фотографии все аккорды расширены.
ссылка на картинку[^]

и в этом случае первый из них закрыт.
ссылка на картинку[^]
как сделать так, чтобы вторая двигалась вверх, если первая закрыта ?

Что я уже пробовал:

Я попытался сделать метод, чтобы пробежаться по всем элементам управления на панели и переместить их вверх. но я не мог заставить его работать.

3 Ответов

Рейтинг:
26

BillWoodruff

Чтобы элементы управления отображались сверху вниз ... в том порядке, в котором вы добавили их на панель ... и пусть другие элементы автоматически изменяют свой размер, когда вы меняете их свойство Height, удаляете их, делаете видимыми или скрываете:

1. добавить вновь добавленные элементы управления в экземпляре коллекции controlcollection принимающей группы

2. Установите для свойства Dock недавно добавленных элементов управления значение 'Top

3. вызовите функцию 'BringToFront() для вновь добавленных элементов управления

using System;
using System.Windows.Forms;

namespace YourNameSpace
{
    public partial class MyAccordion : UserControl
    {
        public MyAccordion()
        {
            InitializeComponent();

        }

        private void MyAccordion_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                MyAccordionElement ele = new MyAccordionElement();

                ele.SetText(i.ToString());

                this.Controls.Add(ele);
                ele.Dock = DockStyle.Top;
                ele.BringToFront();
            }
        }
    }
}
Здесь ' MyAccordionElement-это еще один UserControl (код не показан).


Рейтинг:
1

RickZeeland

Нет необходимости вычислять позиции, просто установите Якорь
Док свойство элементов управления на панели сверху.


BillWoodruff

Мой голос № 1: это чепуха.

RickZeeland

Ой, это, должно быть, была собственность Дока :)

BillWoodruff

Зная, что ты иногда ошибаешься, я чувствую себя менее неуверенно :)

Рейтинг:
0

RickZeeland

Другим вариантом было бы использовать Управления flowlayoutpanel контроль:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var button1 = new Button();
        var button2 = new Button();
        var button3 = new Button();
        this.flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
        this.flowLayoutPanel1.BackColor = Color.Beige;
        this.flowLayoutPanel1.Controls.Add(button1);
        this.flowLayoutPanel1.Controls.Add(button2);
        this.flowLayoutPanel1.Controls.Add(button3);
        button1.Click += ButtonCollapse;
        button2.Click += ButtonCollapse;
        button3.Click += ButtonCollapse;
    }

    private void ButtonCollapse(object sender, EventArgs e)
    {
        var btn = (Button)sender;

        if (btn.Tag == null)
        {
            btn.Height /= 2;
            btn.Tag = "collapsed";
        }
        else
        {
            btn.Height *= 2;
            btn.Tag = null;
        }
    }
}


BillWoodruff

Мой голос №4: хорошая альтернатива; однако добавление только одних кнопок довольно странно.