按屏幕上的位置排序标签列表
本文关键字:排序 标签 列表 位置 屏幕 | 更新日期: 2023-09-27 17:51:08
如何按标签在屏幕上的位置排序标签列表?我的标签在屏幕上移动,但只在X轴上,这是我的代码,但我注意到它不起作用。
labels.OrderBy(x => x.Location.X);
提前感谢!
编辑:这就是我如何测试它是否有效…
private void actualizarPosicoes() {
labels.OrderBy(x => x.Location.X);
MessageBox.Show(labels.First.Value.Text.ToString());
}
但是我想在标签从屏幕上删除时使用它,但首先我必须使OrderBy工作。
private void reorder(Label lb) {
labels.OrderBy(x => x.Location.X);
var it = labels.GetEnumerator();
var node = it.Current;
while (it.MoveNext())
{
var nextNode = it.MoveNext();
if (nextNode != null)
{
if (nextNode.Equals(lb))
{
nextNode = it.MoveNext();
it.Current.Location = new Point(node.Right, 0);
}
}
node = it.Current;
}
}
我有一个名为labels的全局链接列表:
private LinkedList<Label> labels;
我建议您使用FlowLayoutPanel作为标签的容器。删除任何标签将自动重新排列其他标签。
这里是一个示例-假设您有labelsFlowLayoutPanel
来托管标签,addLabelButton
来添加标签:
private void addLabelButton_Click(object sender, EventArgs e)
{
Label label = new Label();
label.Text = DateTime.Now.ToLongTimeString();
label.DoubleClick += label_DoubleClick;
labelsFlowLayoutPanel.Controls.Add(label);
}
void label_DoubleClick(object sender, EventArgs e)
{
Label label = (Label)sender;
labelsFlowLayoutPanel.Controls.Remove(label);
label.DoubleClick -= label_DoubleClick;
}
每次单击addLabelButton
,都会创建新标签并插入到其他标签的右侧。双击任何标签将删除它并重新排列其他标签。
进一步信息- Windows窗体控件第5课:如何使用FlowLayout面板
在不提供任何更好的方法建议的情况下,直接回答这个问题,您的代码的问题如下:
没有修改实例的OrderBy
方法被调用,它将返回一个新的IOrderedEnumerable<TSource>
,其中TSource
是对象类型,例如Label
。这意味着您的代码应该像这样:
labels = labels.OrderBy(x => x.Location.X);
根据labels
对象的类型,您可能需要将其转换为List
,如下所示:
labels = labels.OrderBy(x => x.Location.X).ToList();
EDIT:我刚刚意识到您正在使用LinkedList
,我建议将其更改为private List<Label> labels;
我终于做到了!如果有人需要的话,这里有答案。
private void reorder() {
var it2 = labels.OrderBy(x => x.Location.X);
Label orderLb = it2.ElementAt(0);
for (int i = 1; i < labels.Count; i++)
{
it2.ElementAt(i).Location = new Point(orderLb.Right, 0);
orderLb = it2.ElementAt(i);
}
谢谢大家的帮助,真的很感激!