Изменение порядка элементов управления в панели макета потока
-
06-07-2019 - |
Вопрос
У меня проблемы с использованием flowlayoutPanel в приложении Winform на C #. В основном у меня есть панель макета потока, которая имеет 3 раздела.
Раздел # 1 представляет собой набор из 2 элементов управления .. два раскрывающихся элемента управления, они всегда в одном порядке, всегда видны во всех случаях
Раздел # 2 представляет собой набор из 5 различных элементов управления ... в зависимости от ряда факторов, один из 5 элементов управления становится видимым, для всех остальных для свойства Visible установлено значение false
Раздел # 3 представляет собой набор из 3-х элементов управления. Как и раздел # 1, они всегда в одном и том же порядке и всегда видны.
Итак, все сводится к тому, что раздел # 2 является переменным, остальные - статическими.
Проблема возникает в Разделе № 2 ... когда я изменяю видимость любого из элементов управления, они выглядят просто отлично (IE ... Раздел 1, затем Раздел 2, затем Раздел 3) ... ЗА ИСКЛЮЧЕНИЕМ, когда я устанавливаю комбинированный список элемент управления должен быть видимым .... в этом случае, и ТОЛЬКО в этом случае ... порядок становится (раздел 1, затем раздел 3, затем раздел 2) ... я не могу понять, что может привести к тому, что заказ выйдет из синхронизировать только в этом случае.
Что я в основном делаю в начале моего метода, так это задаю для ВСЕХ элементов управления значение Visible = false ..., затем я устанавливаю Раздел 1 Visible = true ..., затем перебираю условия Раздела 2 и устанавливаю соответствующие элементы управления Visible = true и наконец установите в разделе 3 элементы управления Visible = true.
Кто-нибудь имеет опыт заказа элементов управления панели макета потока? Я не могу понять, что происходит с ComboBox.
Решение
Может быть, проще добавить еще одну панель Flowlayout для раздела 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);
}
}
Вы можете изменить порядок элементов управления на поточной панели, изменив родительское свойство элементов управления и переназначив родительское свойство в нужном вам порядке.
Попробуйте это общее решение, в котором вы можете отсортировать элементы управления по свойству в пользовательском элементе управления.
// When adding and removing controls, the order is not kept.
var runsOrderedByStartDate = this.nodesFlowLayoutPanel.Controls.Cast<RunNodeControl>().Select(_ => new { StartDate = _.StartDateTime, RunControl = _ }).OrderBy(_ => _.StartDate).ToList();
// Sets index of controls according to their index in the ordered collection
foreach (var anonKeyValue in runsOrderedByStartDate)
{
this.nodesFlowLayoutPanel.Controls.SetChildIndex(anonKeyValue.RunControl, runsOrderedByStartDate.IndexOf(anonKeyValue));
}
SetChildIndex
не сбрасывает порядок элементов управления на панели разметки. Поэтому, когда мы выполняем FlowLayoutPanel.GetNextControl (q, true)
, вывод не верен.
Для базового упорядочения элементов управления простейший способ управления порядком элементов управления в flowlayoutPanel - установить для свойства flowlayoutPanel TabStop значение true. Установите для свойства tabstop для элементов управления значение True и установите порядок вкладок в том порядке, в котором вы хотите, чтобы элементы управления отображались.