c# Выход программно добавленных кнопок за пределы формы

Всем привет. При добавлении кнопок в цикле на панель они выходят за её границы. Я понимаю, почему это происходит, но не знаю, как отследить и перенести на новую "строку". Ниже код, как я добавляю:

for (int i = 0; i < dt.Rows.Count; i++) //для всех полученных строк
            {
                if (dt.Rows[i][3] != null) //если столик не закрыт
                {
                    BunifuButton btn = new BunifuButton
                    {
                        Size = new Size(188, 106),
                        Text = $"Стол №{dt.Rows[i][1]}", //dt.rows[i][1] - это номер стола
                        Location = new Point(i * 190, 0) //вот тут проблема. Может как-то в цикле проверять, "дошёл" ли цикл до края панели.
//так же, проблема в том, что окно с формой у меня разворачивается на полный экран (maximized), поэтому я не знаю, как отследить, какой размер формы будет у конкретного пользователя (ведь размер экрана у каждого свой)
                    };

                    TablePanel.Controls.Add(btn);
                }
            }

Скриншот: введите сюда описание изображения

UPD:

Попробовал немного переписать и, вроде, работает, ноооо может есть более красивое решение этой проблемы?

            int X = 0;
            int Y = 0;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i][3] != null) //если столик не закрыт
                {
                    BunifuButton btn = new BunifuButton
                    {
                        Size = new Size(188, 106),
                        Text = $"Стол №{dt.Rows[i][1]}"
                    };

                    if ((X + 1) * (btn.Size.Width + 2) >= this.Size.Width)
                    {
                        X = 0;
                        Y += btn.Size.Height + 2;
                    }
                    btn.Location = new Point(X * (btn.Size.Width + 2), Y);
                    X++;

                    TablePanel.Controls.Add(btn);
                }
            }

И ещё вопрос, если внизу место закончится, то как-то можно реализовать "переход" на новую страницу или что-нибудь такое?


Ответы (1 шт):

Автор решения: Frehzy

Решение: Используйте TableLayoutPanel, если столкнулись с подобной проблемой. Несколько полезных команд, которые могут упростить заполнение данной панели:

1.

TablePanel.Controls.Add(btn, 0, thisRows); 

//btn - контрол, 0 - столбец на панели, thisRows - строка, в которую нужно добавить 2.

foreach (RowStyle style in TablePanel.RowStyles)
{
    style.SizeType = SizeType.Absolute;
    style.Height = TablePanel.Size.Height / maxRowsOnPage;
}

//TablePanel - название панели, maxRowsOnPage - максимальное количество строк на панели

  1. https://coderoad.ru/6677533/%D0%9A%D0%B0%D0%BA-%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C-%D0%BC%D0%B5%D1%80%D1%86%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B2-TableLayoutPanel-%D0%B2-c-net

В случае "мерцания" панели - код "Double Buffered function". Если заполняете в цикле, то вставляете после каждой итерации.

  1. Так же, если вы загружаете довольно-таки большое кол-во строк, прописывайте в начале метода this.Enabled = false и в конце this.Enabled = true, чтобы не давать пользователю тыкать куда-либо, пока идём загрузка

  2. Так же, если работаете с какими-либо кнопками, которые программно добавляете на панель - создайте List, в который добавляйте в цикле те же кнопки, что вы добавили на панель, чтобы после можно было взаимодействовать с ними, если будет такая задача. Простейший пример:

     List<BunifuButton> buttons = new List<BunifuButton>(); //в начале метода
     foreach (Button btn in buttons) //после добавления всех нужных кнопок в List
         btn.Focus();
    

Надеюсь, кому-нибудь помог

→ Ссылка