2010-02-08 2 views
3

У меня есть место в моем коде, где я динамически добавляю элементы управления в 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().

+0

Был несколько схожий вопрос. Вместо использования Controls.Add (button) я использовал Button.parent = flowLayoutPanel. Это вызвало изменение порядка - переход на controls.add поместил все в правильном порядке. –

ответ

1

Первый работает Arrangement1 дает мне: control1 Control2 Control3

Бег arrangement2 дает мне: control1 movingcontrol Control2 Control3

Ваш код, чистый, как он писал, работает для меня.

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

Итак, я подозреваю, что это то, что вы не разместили, возможно, где вы храните элементы управления самостоятельно? хранят ли вы их в массиве или в списке?

+0

Как указано выше. Эти элементы управления являются членами пользовательского класса представления, который управляется через класс контроллера вида. Я бы опубликовал больше кода, если бы мог сузить, какой код отправлять. Я предполагаю, что я ищу информацию о том, что может вызвать «Добавить вставить» по индексу, отличному от последнего индекса коллекции, особенно после «Очистить», а не «Удалить». –

+0

Насколько я понимаю, вам должно быть сложно упростить код, чтобы сформулировать его здесь, в понятный вопрос. Тип, в котором хранятся экземпляры управления, может повлиять на порядок. Например, в списке или словаре нет понятия «порядок» или сортировка. Если он находится в массиве, то позиция в массиве - это порядок. Если, однако, пользователь может удалить и повторно добавить вещи один за другим, тогда у вас будет тот же случай, который был у меня в моем первоначальном ответе. – Roast

0

Не было бы проще просто переключить видимость перемещенияControl?

Но я предполагаю, что этот ответ основан на вашем примере, так что, если происходит больше перераспределения, это может не примениться.

В сочетании с переключением видимости вы также можете использовать вместо этого ControlCollection.SetChildIndex(), что кажется более подходящим и, скорее всего, приведет к более плавному переупорядочению.

Смежные вопросы