#c# #forms #controls
#c# #формы #элементы управления
Вопрос:
Я настроил программу, которая добавляет новые строки, когда установлен флажок в конце. Моя проблема с автоматической прокруткой. Когда строки выходят за край окна, создается следующая строка, но похоже, что она устанавливает начало координат в начальную точку предыдущей строки.
Вот часть кода:
private void AddRow(object sender, EventArgs e)
{
bool check = ((CheckBox)sender).Checked;
if (check)
{
proj[i] = new Label();
proj[i].Text = "Proj #";
proj[i].Width = 50;
proj[i].Location = new Point(10, (i * 22) 50);
...
split[i] = new CheckBox();
split[i].Text = "";
split[i].Location = new Point(430, (i * 22) 50);
split[i].CheckedChanged = new EventHandler(AddRow);
}
this.Controls.Add(proj[i]);
}
И вот пара скриншотов:
Как я могу решить эту проблему?
Ответ №1:
Проблема заключается в том, как ведет себя автоматическая прокрутка. При прокрутке вниз поведение автоматической прокрутки фактически перебирает все ваши элементы управления и перемещает их вверх, изменяя их Top
свойства. Это, безусловно, затрудняет добавление другой строки. Два простых варианта:
Вариант 1: Добавьте каждую строку элементов управления на свою собственную панель (или, что лучше, создайте UserControl
содержащую их). Затем добавьте каждую из этих панелей в FlowLayoutPanel
или GridLayoutPanel
, который выполнит вычисление координат для вас.
-ИЛИ-
Вариант 2: вместо использования (i * 22) 50
используйте:
if (i == 0)
proj[i].Location = new Point(10, 50);
else
proj[i].Location = new Point(10, proj[i-1].Top 22);
Аналогично для всех ваших других элементов управления.
Первый вариант более практичен, но второй может быть более быстрым прямым решением. Вам также следует рассмотреть возможность использования вместо этого элемента управления grid, особенно если количество строк может быть большим.
Комментарии:
1. Это сработало отлично, я использовал вариант 1, и это было очень простое изменение. Большое вам спасибо.