我在C#winform应用程序中使用flowlayoutPanel时遇到问题。我基本上拥有一个包含3个部分的流布局面板。

第1节是一组2个控件..两个下拉控件,它们总是以相同的顺序,在所有实例中始终可见

第2节是一组5个不同的控件......基于一系列因素,5个控件中的1个可见,所有其他控件的Visible属性设置为false

第3节是一组3个控件..就像第1节一样,它们总是处于相同的顺序并始终可见。

因此,归结为第2节是可变的,其他部分是静态的。

问题来自第2节......当我改变任何控件的可见性时,它们看起来很好(IE ...第1节然后第2节然后第3节)...除了我设置组合框时控制是可见的....在这种情况下,只有在这种情况下..订单变为(第1节然后第3节然后第2节)...我无法弄清楚是什么会导致订单被排除在外在这种情况下同步。

我在方法开头基本上做的是将ALL控件设置为Visible = false ...然后我设置Section 1 Visible = true ...然后循环第2节的条件并设置适当的控件Visible = true,最后设置Section 3控制Visible = true。

有没有人对流程布局面板控件排序有任何经验?我无法弄清楚ComboBox发生了什么。

有帮助吗?

解决方案

可能更容易为第2部分删除另一个flowlayoutpanel,然后将第2部分控件放入其中?这样,顶部面板中的可见控件永远不会改变,您也不必担心订购。

其他提示

Inside FlowLayoutPanel.Controls 是一个名为 SetChildIndex(Control c,int index)的方法函数,它允许您将对象设置为特定索引。

由于FlowLayoutPanel使用控件的索引来确定将它们绘制到哪个顺序,因此您可以将其设置为您想要交换的控件的索引,并且它将控制索引上升一个,然后每个控制索引。

以下是我的博客在FlowLayoutPanel中重新排序PictureBox。

在名为 flowLayoutPanel1 的WinForm上添加FlowLayoutPanel:

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);
    }
}

您可以对flowpanel上的控件进行重新排序,更改控件的父属性,并使用您需要的顺序重新分配父属性。

尝试此通用解决方案,您可以根据用户控件中的属性对控件进行排序。

// 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 不会重置flowlayout面板中控件的顺序。因此,当我们执行 FlowLayoutPanel.GetNextControl(q,true)时,输出不正确。

对于基本控件排序,控制flowlayoutPanel中控件顺序的最简单方法是将flowlayoutPanel TabStop属性设置为true。将控件tabstop属性设置为True,并将Tab键顺序设置为您希望控件显示的顺序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top