1

您好,我在通过17 个标签列表进行迭代时遇到问题:

for (int i = 0; i < labels.Count - 1; i++)
{
    MessageBox.Show(labels[i].Name);
    if (labels[i].Visible == false && labels[i + 1].Visible == true)
    {
        ...

这是我得到的结果:

首先它从label10to 开始label17,然后从label9to降序排列label2

这是我将标签添加到列表中的方法:

private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (Control c in this.Controls)
    {
        if (c is Label)
        {
            labels.Add(c);
            c.Enabled = true;
            if (c.Visible == false)
            {
                c.Visible = true;
            }
        }
    }
}

我希望它从label1to label16,因为循环只是一个循环,我猜问题在于标签添加到列表中的顺序,但我不知道如何解决它。

4

5 回答 5

1

您的主要问题是字典顺序,当您按标签的名称排序时固有地使用它,您想要的是在 term 之后按数字排序label。在这种情况下,首先对标签列表进行排序,然后对其运行 for 语句,检查代码:

var lst = labels.OrderBy(x => int.Parse(x.Name.Substring("label".Length))).ToList();
for (int i = 0; i < lst.Count - 1; i++)
{
    MessageBox.Show(lst[i].Name);
    ...

但请记住,此代码很简单,并且假定标签名称属性始终以“标签”字符串开头。如果这可以改变,你必须处理这种情况。

于 2013-05-08T09:23:47.457 回答
0

假设您的标签 id 为 Label1,Label2........,Label16 为了连续获取标签,您必须编写以下代码

labels = labels.ConvertAll<Control>(GetIdFromLabel);
labels.Sort((x, y) => { return x.Id.CompareTo(y.Id); });

public Control GetIdFromLabel(Control c)
    {
        c.Id = c.Name.Replace("Label", "") == "" ? 0 : Convert.ToInt32(c.Name.Replace("Label", ""));
        return c;
    }

在你的代码中添加这个类

public class Control
{
    public string Name { get; set; }
    public int Id { get; set; }
}
于 2013-05-08T09:25:40.500 回答
0

试试这个:

    private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
    {
        labels.Clear();
        Control[] matches;
        for (int i = 1; i <= 16; i++)
        {
            matches = this.Controls.Find("label" + i.ToString(), true);
            if (matches.Length > 0 && matches[0] is Label)
            {
                Label lbl = (Label)matches[0];
                labels.Add(lbl);
                lbl.Enabled = true;
                if (lbl.Visible == false)
                {
                    lbl.Visible = true;
                }

            }
        }
    }
于 2013-05-08T10:14:55.813 回答
0

检查designer.cs文件以查看标签添加到表单的顺序

于 2013-05-08T09:09:44.433 回答
0

我猜你想根据他们的名字对标签进行排序?

labels.Sort((x, y) => { return x.Name.CompareTo(y.Name); });

但有什么区别:

  1. 首先显示“标签 1”,然后显示“标签 2”,然后
  2. 先显示“标签 2”,然后显示“标签 1”?
于 2013-05-08T08:56:43.030 回答