Это могло бы быть легче отбросить другой flowlayoutpanel в для раздела 2, затем отбросить Ваш раздел 2 средств управления в это? Тем путем видимые средства управления в Вашей верхней панели никогда не изменяются, и Вы не должны будете волноваться об упорядочивании.
Внутри FlowLayoutPanel.Controls
- это функция метода с именем SetChildIndex (Control c, int index)
, которая позволяет установить объект для определенного индекса. .
Поскольку FlowLayoutPanel использует индексы элементов управления для определения порядка их отрисовки, вы можете установить это значение для любого индекса элемента управления, с которым вы хотите поменяться местами, и он будет увеличивать индекс этого элемента управления на один и каждый последующий.
Вот отрывок из моего блога переупорядочения PictureBox в FlowLayoutPanel.
Добавьте FlowLayoutPanel в WinForm с именем flowLayoutPanel1
:
public partial class TestForm: Form
{
public TestForm()
{
InitializeComponent();
this.flowLayoutPanel1.AllowDrop = true
}
private void AddImageToBlog(System.Drawing.Image image)
{
PictureBox pbox = new PictureBox();
pbox.SizeMode = PictureBoxSizeMode.Zoom;
pbox.Height = (_picturebox_height * _ScaleFactor);
pbox.Width = (_picturebox_width * _ScaleFactor);
pbox.Visible = true;
pbox.Image = image;
pbox.MouseDown += new MouseEventHandler(pbox_MouseDown);
pbox.DragOver += new DragEventHandler(pbox_DragOver);
pbox.AllowDrop = true;
flpNewBlog.Controls.Add(pbox);
}
void pbox_DragOver(object sender, DragEventArgs e)
{
base.OnDragOver(e);
// is another dragable
if (e.Data.GetData(typeof(PictureBox)) != null)
{
FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;
//Current Position
int myIndex = p.Controls.GetChildIndex((sender as PictureBox));
//Dragged to control to location of next picturebox
PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));
p.Controls.SetChildIndex(q, myIndex);
}
}
void pbox_MouseDown(object sender, MouseEventArgs e)
{
base.OnMouseDown(e);
DoDragDrop(sender, DragDropEffects.All);
}
}
Другим возможным решением является использование ViewFlipper или ViewSwitcher в качестве раздела «Content», в который включаются различные типы содержимого, между которыми требуется переключиться, и только задание представления, которое требуется отобразить (можно также выполнять анимацию на триггере/переключателе). Недостатком является то, что содержимое должно быть добавлено в основной макет, который каждый вид является дочерним по отношению к ViewFlipper/ViewSwitcher (может использоваться или также для сохранения макетов в отдельных XML-файлах).
Делегирование рендеринга коммутируемого содержимого другому действию не является таким прямым. TabHost/TabWidget допускает, что, где область содержимого хоста табуляции создается из другого действия. В качестве примера можно использовать код Tab, если необходимо выполнить его таким пути.
-121--3076001- SetChildIndex
не сбрасывает порядок элементов управления на панели раскладки. Таким образом, при выполнении FlowLayoutPanel.GetNextControl (q, true)
вывод неверен.