У меня есть место в моем коде, где я динамически добавляю элементы управления в FlowLayoutPanel сверху вниз. Мне нужно, чтобы элементы управления отображались в определенном порядке, поэтому каждый раз я делаю очистку коллекции FlowLayoutPanel.Controls, а затем добавляю каждый дочерний элемент управления в том порядке, в котором я хочу, чтобы они отображались. Мой код делает это:Неожиданное изменение индекса при добавлении элемента управления в FlowLayoutPanel
private void arrangement1()
{
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.Add(control1);
flowLayoutPanel1.Controls.Add(control2);
flowLayoutPanel1.Controls.Add(control3);
}
Большую часть времени это отлично работает. Тем не менее, есть один конкретный элемент управления, который не поддерживает его положение в коллекции управления при добавлении других элементов управления после него. Например, в следующем сегменте кода:
private void arrangement2()
{
flowLayoutPanel1.Controls.Clear();
flowLayoutPanel1.Controls.Add(control1);
flowLayoutPanel1.Controls.Add(movingControl);
//movingControl current is at index = 1 in Controls.
flowLayoutPanel1.Controls.Add(control2);
//control2 is now at index = 1, movingControl got bumped to index = 2 in Controls.
flowLayoutPanel1.Controls.Add(control3);
//control3 is now at index =2, movingControl got bumped to index = 3 in Controls.
}
Это происходит только при первом перемещении MoveControl в элементы управления. Если я вернусь и позвоню в договоренность1, а затем по договоренности2 во второй раз. Элементы управления появится в том порядке из:
- Control1
- movingControl
- Control2
- Control3
Это, кажется, ошибка в коде Controls.Add. Либо это, либо документация для поведения .Add неполна, так как она не всегда добавляет к концу коллекции. Кто-нибудь знает, почему это происходит. Очевидный «исправить», это просто позвонить:
arrangement2();
arrangement1();
arrangement2();
Однако, это кажется очень плохим решением какой-либо другой основной проблемой.
Заранее благодарим за помощь!
EDIT: Обратите внимание, что каждый из этих элементов управления является членом пользовательского класса вида, поэтому они сохраняются после очистки коллекции элементов управления. Однако эти элементы управления не хранятся в какой-либо упорядоченной коллекции. Они просто являются членами этого пользовательского класса. Показанный выше код работает правильно, как показано. Однако в контексте моей GUI-программы у нее есть описанное ошибочное поведение. Я бы опубликовал больше кода, если бы знал, что будет полезно, но есть много кода, который затрагивает эти точки. Это весь код, который выполняется для описанного действия.
Что я действительно ищу, это то, что возможные сценарии вызывают Controls.Add для вставки элемента управления не в последний индекс коллекции. В частности, после вызова Clear() и вызовов NO Remove().
Был несколько схожий вопрос. Вместо использования Controls.Add (button) я использовал Button.parent = flowLayoutPanel. Это вызвало изменение порядка - переход на controls.add поместил все в правильном порядке. –