14

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

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

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

第 3 节是一组 3 个控件 .. 与第 1 节一样,它们始终以相同的顺序排列并且始终可见。

所以这归结为第 2 部分是可变的,其他部分是静态的。

问题出现在第 #2 节...当我更改任何控件的可见性时,它们看起来都很好(IE ... 第 1 节然后第 2 节然后第 3 节)...除了我将组合框控件设置为可见....在这种情况下,并且仅在这种情况下..订单变为(第 1 节然后第 3 节然后第 2 节)...我无法弄清楚是什么导致排序不同步那个案子。

我基本上在我的方法开始时所做的是将所有控件设置为 Visible = false ... 然后我设置第 1 节 Visible = true ... 然后循环通过第 2 节的条件并设置适当的控件 Visible = true 最后设置第 3 节控件可见 = true。

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

4

6 回答 6

34

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

由于 FlowLayoutPanel 使用控件的索引来确定绘制它们的顺序,因此您可以将其设置为您想要交换的任何控件的索引,它会将该控件的索引增加一个,然后再增加一个。

这是我博客中关于在 FlowLayoutPanel 中重新排序 PictureBoxes 的片段。

在名为的 WinForm 上添加 FlowLayoutPanel 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);
    }
}
于 2009-07-30T15:30:10.037 回答
4

在第 2 节中放置另一个 flowlayoutpanel 是否更容易,然后将第 2 节控件放入其中?这样,您顶部面板中的可见控件就不会改变,您也不必担心订购问题。

于 2009-01-08T20:56:29.763 回答
2

您可以重新排序流程面板上的控件,更改控件的父属性并按照您需要的顺序重新分配父属性。

于 2010-10-04T09:32:22.737 回答
1

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

// 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));
}
于 2014-07-11T13:30:12.777 回答
0

SetChildIndex不会重置 flowlayout 面板中控件的顺序。所以我们执行FlowLayoutPanel.GetNextControl(q, true)的时候输出是不正确的。

于 2010-02-11T20:00:28.787 回答
0

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

于 2018-03-21T17:27:30.957 回答