您好我在通过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)
{
...
以下是我得到的结果:
首先它从label10
转到label17
,然后从label9
降序到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;
}
}
}
}
我希望它从label1
转到label16
,因为循环只是一个循环我想问题在于标签添加到列表的顺序,但我不是确定如何解决它。
答案 0 :(得分:1)
您的主要问题是词典顺序,当您按标签的名称排序时,它本身就会被使用,您希望在术语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);
...
但请记住,此代码很简单,并假设标签Name属性始终以“label”字符串开头。如果可以改变,你必须处理这种情况。
答案 1 :(得分:0)
我想你想根据他们的名字对标签进行排序?
labels.Sort((x, y) => { return x.Name.CompareTo(y.Name); });
但有什么区别:
答案 2 :(得分:0)
检查designer.cs
文件,查看标签添加到表单的顺序
答案 3 :(得分: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; }
}
答案 4 :(得分: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;
}
}
}
}