按屏幕上的位置排序标签列表

本文关键字:排序 标签 列表 位置 屏幕 | 更新日期: 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);
}

谢谢大家的帮助,真的很感激!