Неожиданное изменение индекса при добавлении элемента управления в FlowLayoutPanel - PullRequest
3 голосов
/ 08 февраля 2010

В моем коде есть место, где я динамически добавляю элементы управления к расположенной сверху вниз FlowLayoutPanel. Мне нужно, чтобы элементы управления отображались в определенном порядке, поэтому каждый раз, когда я делаю очистку коллекции FlowLayoutPanel.Controls, добавляю каждый дочерний элемент управления в том порядке, в котором я хочу, чтобы они отображались. Мой код делает это:

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.
}

Это происходит только в первый раз, когда movingControl добавляется в Controls. Если я вернусь и позвоню договоренности1, а затем договоренности2 во второй раз. Элементы управления появятся в намеченном порядке:

  • control1
  • movingControl
  • Control2
  • Control3

Кажется, это ошибка в коде для Controls.Add. Либо это, либо документация по поведению .Add является неполной, поскольку она не всегда добавляет к концу коллекции. Кто-нибудь знает, почему это происходит? Очевидное «исправление» - просто позвонить:

arrangement2();
arrangement1();
arrangement2();

Однако это кажется очень плохим решением какой-то другой основной проблемы.

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ: обратите внимание, что каждый из этих элементов управления является членом пользовательского класса представления, поэтому они сохраняются после очистки коллекции элементов управления. Однако эти элементы управления не хранятся в какой-либо упорядоченной коллекции. Они просто члены этого пользовательского класса. Показанный выше код работает правильно, как показано. Тем не менее, в контексте моей программы с графическим интерфейсом описывается ошибочное поведение. Я бы опубликовал больше кода, если бы у меня была идея, что было бы полезно, но есть много кода, который касается этих частей. Это весь код, который выполняется для описанного действия.

Что я действительно ищу, так это возможные сценарии, вызывающие Controls.Add, чтобы вставить элемент управления не в последний индекс коллекции. В частности, после вызова Clear () и без вызовов Remove ().

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

Первый запуск Arrangement1 дает мне: control1 Control2 Control3

Беговая дорожка2 дает мне: control1 movingcontrol Control2 Control3

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

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

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

0 голосов
/ 21 июня 2010

Не проще ли переключить видимость movingControl?

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

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

...