【问题标题】:How to reverse a FlowLayoutPanel?如何反转 FlowLayoutPanel?
【发布时间】:2016-06-25 21:37:19
【问题描述】:

我正在尝试反转 FlowLayoutPanel 中控件的顺序。

我尝试将 ControlCollection 转换为数组,然后将其反转并清除 ControlCollection,然后读取控件。但这似乎并没有达到预期的效果。

这是我使用的代码:

private static void ReverseLayout(Control control, bool suspend = true) {
     if (suspend) control.SuspendLayout();
     Control[] newCC = new Control[control.Controls.Count];
     control.Controls.CopyTo(newCC, 0);
     Array.Reverse(newCC);
     control.Controls.Clear();
     //control.Controls.AddRange(newCC);
     for (int i = 0; i < newCC.Length; i++) {
        newCC[i].Location = new System.Drawing.Point(); // maybe? no :\
        newCC[i].TabIndex = i; // maybe? no :\
        control.Controls.Add(newCC[i]);
     }
     if (suspend) control.ResumeLayout(false);
  }

【问题讨论】:

  • 根据docs有一个属性描述如下“获取或设置一个指示FlowLayoutPanel控件流向的值”。不幸的是,文档对我来说是坏的,不显示名称。我猜它被称为 FlowDirection 并且值是 LeftToRight 等。但是使用智能感知来查看它是否可以洞察正确的值
  • 这只会改变之后添加的对象将显示在面板中的位置。已经存在的物体不会被触摸。

标签: c# flowlayoutpanel controlcollection


【解决方案1】:

您的代码似乎比它需要的复杂。尝试将控件放在List&lt;Control&gt; 中,然后对其调用 reverse,将集合放回:

int firstTabIndex = flp.Controls[0].TabIndex;
List<Control> controls = flp.Controls.Cast<Control>().ToList();
flp.Controls.Clear();
controls.Reverse();
flp.Controls.AddRange(controls.ToArray());

对于 TabIndex 属性,您必须重新应用该值:

for (int i = 0; i < flp.Controls.Count; ++i) {
  flp.Controls[i].TabIndex = firstTabIndex + i;
}

【讨论】:

  • 你从哪里得到'Cast().ToList()'? ControlCollection 没有这样的定义
  • using Linq; 但据我所知,这并没有改变 FlowLayoutPanel 的行为,它似乎已经失去了正确安排重新添加的控件的能力
  • @globalenemy 您使用的是什么版本的 .net? Cast 是 Enumerable 类的扩展,需要引用 System.Linq。
  • @globalenemy 怎么不工作?我刚刚更新了关于 TabIndex 问题的内容。
  • 仍然没有完成这项工作。顺便提一句。你的代码现在完全一样,只是你有一个 lst 而不是一个数组。您仍然转换为数组。复杂的代码就这么多。但是获取 tabindex 的步骤很好。我自己错过了。 (顺便说一句,我也不需要更改 tabindex。这只是我自己的尝试)
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2011-01-05
相关资源
最近更新 更多