C#在屏幕上按位置排列标签列表

C#在屏幕上按位置排列标签列表,c#,winforms,list,location,C#,Winforms,List,Location,如何按标签在屏幕上的位置排列标签列表? 我的标签在屏幕上移动,但只在X轴上移动,这是我的代码,但我注意到它不起作用 labels.OrderBy(x => x.Location.X); 提前谢谢你 编辑:这就是我测试它是否有效的方式 private void actualizarPosicoes() { labels.OrderBy(x => x.Location.X); MessageBox.Show(labels.First.Value.

如何按标签在屏幕上的位置排列标签列表? 我的标签在屏幕上移动,但只在X轴上移动,这是我的代码,但我注意到它不起作用

 labels.OrderBy(x => x.Location.X);
提前谢谢你

编辑:这就是我测试它是否有效的方式

 private void actualizarPosicoes() {

        labels.OrderBy(x => x.Location.X);

        MessageBox.Show(labels.First.Value.Text.ToString());


    }
但是我想在标签从屏幕上移除时使用它,但首先我必须通过工作来进行排序

 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;

        }


    }
我有一个名为标签的全局链接列表:

private LinkedList<Label> labels;
私有链接列表标签;
我建议您将其用作标签的容器。删除任何标签将自动重新排列其他标签

以下是示例-假设您有
LabelFlowLayoutPanel
来承载标签,并有
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
都会创建新标签并将其插入到其他标签的右侧。双击任何标签都会将其删除并重新排列其他标签


进一步信息-

不提供任何关于更好方法的建议,为了直接回答问题,代码的问题如下:

调用不修改实例的
OrderBy
方法时,它将返回一个新的
iorderenumerable
,其中
TSource
是对象的类型,例如
Label
。这意味着您的代码应该如下所示:

labels = labels.OrderBy(x => x.Location.X);
根据对象
标签
的类型,您可能需要将其转换为
列表
,如下所示:

labels = labels.OrderBy(x => x.Location.X).ToList();

编辑:我刚刚意识到您正在使用
链接列表
,我建议将其更改为
私有列表标签

我终于做到了! 如果有人需要它,答案是存在的

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);
}
private void reorder(){
var it2=labels.OrderBy(x=>x.Location.x);
标签顺序lb=it2.ElementAt(0);
对于(int i=1;i

谢谢大家的帮助,非常感谢!

你怎么知道它不起作用?它的哪一部分不起作用?它们都有相同的父控件?还是属于不同的控件?在排序之前,你是如何获得初始列表的?请发布更多的代码,不要再继续了。我唯一能猜到的是t是您需要重新分配
标签的值,即
标签=标签.OrderBy(x=>x.Location.x)的结果
但在提供更多上下文之前,这只是一个猜测。它返回带有有序列表的新枚举,您想做什么?@JoãoSilva您正在尝试对齐一行中的所有标签,中间没有空格?我以前有FlowLayoutPanel,但它不能按需要工作,因此我必须创建自己的自定义面板。。。