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 шт):
Решение: Используйте 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 - максимальное количество строк на панели
В случае "мерцания" панели - код "Double Buffered function". Если заполняете в цикле, то вставляете после каждой итерации.
Так же, если вы загружаете довольно-таки большое кол-во строк, прописывайте в начале метода this.Enabled = false и в конце this.Enabled = true, чтобы не давать пользователю тыкать куда-либо, пока идём загрузка
Так же, если работаете с какими-либо кнопками, которые программно добавляете на панель - создайте List, в который добавляйте в цикле те же кнопки, что вы добавили на панель, чтобы после можно было взаимодействовать с ними, если будет такая задача. Простейший пример:
List<BunifuButton> buttons = new List<BunifuButton>(); //в начале метода foreach (Button btn in buttons) //после добавления всех нужных кнопок в List btn.Focus();
Надеюсь, кому-нибудь помог
