Переопределение элементов управления в панели раскладки потока
У меня возникли проблемы с использованием flowlayoutPanel в приложении winform С#. У меня в основном есть панель макета потока, которая имеет 3 раздела.
Раздел №1 представляет собой набор из 2 элементов управления. Два элемента управления выпадающего меню, они всегда находятся в одном порядке, всегда отображаются во всех экземплярах
Раздел №2 представляет собой набор из 5 различных элементов управления... на основе ряда факторов, 1 из 5 элементов управления становится видимым, все остальные имеют значение Visible propertyt равное false
Раздел № 3 представляет собой набор из 3 элементов управления. Например, раздел №1, они всегда в одном порядке и всегда видны.
Так что это сводится к тому, что раздел №2 является переменным, остальные являются статическими.
Проблема связана с разделом № 2... когда я изменяю видимость любого из элементов управления, которые они кажутся просто прекрасными (IE... Раздел 1, затем Раздел 2, затем Раздел 3)... ЗА ИСКЛЮЧЕНИЕМ, когда я устанавливаю выпадающий список контроль должен быть видимым.... в этом случае, и ТОЛЬКО в этом случае.. заказ становится (раздел 1, затем раздел 3, а затем раздел 2)... Я не могу понять, что приведет к тому, что заказ будет отсутствовать синхронизация в этом случае.
То, что я в основном делаю в начале моего метода, задает ВСЕ элементы управления Visible = false... тогда я устанавливаю раздел 1 Visible = true... затем перебираю условия раздела 2 и устанавливаю соответствующие элементы управления Visible = true и, наконец, установить элементы управления Section 3 Visible = true.
Есть ли у кого-нибудь опыт управления настройками панели управления потоком? Я не могу понять, что происходит для ComboBox.
Ответы
Ответ 1
Может ли быть проще сбросить еще один flowlayoutpanel для раздела 2, а затем добавить в него элементы управления раздела 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);
}
}
Ответ 3
Вы можете изменить порядок контроля над потоковой панелью, изменить родительское свойство элементов управления и переназначить родительское свойство в том порядке, в котором вы нуждаетесь.
Ответ 4
Попробуйте это общее решение, в котором вы можете сортировать элементы управления в соответствии с свойством в пользовательском элементе управления.
// 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));
}
Ответ 5
SetChildIndex
не reset порядок элементов управления на панели flowlayout. Поэтому, когда мы выполняем FlowLayoutPanel.GetNextControl(q, true)
, вывод неправильный.
Ответ 6
Для базового упорядочения элементов управления простейший способ контролировать порядок элементов управления в flowlayoutPanel - установить для свойства flowlayoutPanel TabStop значение true. Установите для свойства tabstop для элементов управления значение True и установите порядок вкладок в том порядке, в котором вы хотите, чтобы элементы управления отображались.