如何将文本分配给标签 ID 由字符串分配的标签?

How to assign text to a Label with the Label ID being assigned by a string?

目标:
要写在label text,但是标签ID是由字符串赋值的。

问题:
它不起作用,没有给出错误。我在大多数地方寻找答案,但没有任何帮助!

我的代码:

string asdfj = treeView2.SelectedNode.Text;
string adqien = System.IO.Path.Combine(dir7, asdfj);
string[] tnsop = System.IO.File.ReadAllLines(@adqien);
h1a.Text = "100";
for (int o = 2; o > 6; o++)
{
    //This is the label name e.g "h2a',h3a" etc
    string tempc = string.Format("h" + o.ToString() + "a");

    foreach (Control ctr in this.Controls)
    {
        if (ctr is Label)
        {
            if (ctr.Name == tempc)
            {
                ctr.Text = tnsop[o];
            }
        }
    }
}

我也参考了这个post:
Use string variable content as label ID to update label.Text, I get error - 'string' does not contain a definition for 'Text'

你可以像这样简单地做:

this.Controls.Find(labelname).Text = Value;

this.Controls.OfType<Label>().FirstOrDefault(x => x.Name == labelName).Text = Value;

for 循环

首先,这是错误的for (int o = 2; o > 6; o++)

它从 o = 2 开始,然后检查 o > 6 是否为假,因为 o = 2,然后跳过循环。

我猜你想写:for (int o = 2; o < 6; o++)。我不确定,请根据需要进行修复。

附录:这很容易被调试和步进发现。您可以先在代码上添加一个断点(在 Visual Studio 中,您可以将光标放在所需的行上,然后按 F9 - 默认情况下),然后在调试器中添加 运行。当到达带有断点的行时,调试器停止执行并让您检查变量的值、调用堆栈等。然后您可以使用 F10 或 F11 单步执行(如果您想进入方法调用内部)看看代码是如何演变的。您会注意到它没有进入 for 循环。


查找标签

如果仍然找不到标签,我猜问题是标签没有直接在表格上,或者标签没有给定的名称。

您可以使用 this.Controls.Find(name, searchAllChildren) 来获取您需要的标签。

即:

string labelName = string.Format("h" + o.ToString() + "a");
Control[] control = this.Controls.Find(labelName, true);

注:是的,我看你怎么用就知道是label的名字。使用评论告诉我可以节省一些时间......但是,请使用更好的变量名称。如果变量名称是这样的话,你不需要评论来告诉我这是标签的名称。

您还需要检查它的标签:

string labelName = string.Format("h" + o.ToString() + "a");
Control[] controls = this.Controls.Find(labelName, true);
foreach (Control control in controls)
{
    if (control is Label) // if (control.GetType() == typeof(Label))
    {
       // ...
    }
}

建立词典

但是,我建议不要每次都这样做。相反,我建议建立一个字典:

Dictionary<string, Label> labels;

// ...

labels = new Dictionary<string, Label>();

for(int o = 2; o < 6; o++)
{
    string labelName = string.Format("h" + o.ToString() + "a");
    Label label = GetLabel(labelName);
    labels.Add(labelName, label);
}

// ...

private Label GetLabel(string labelName)
{
    Control[] controls = this.Controls.Find(labelName, true);
    foreach (Control control in controls)
    {
        if (control is Label) // if (control.GetType() == typeof(Label))
        {
           return control as Label;
        }
    }
    return null;
}

注意:我建议把字典做成一个字段,在表单加载时只初始化一次。

这将查找标签的责任与读取文件(程序外部)分开了。允许您测试它是否可以在不需要文件的情况下找到正确的控件。

这也会使 Label 不可见的情况(我们刚刚向字典中添加了一个 null)。

然后使用它:

string[] tnsop = System.IO.File.ReadAllLines(@adqien);
for (int o = 2; o < 6; o++)
{
    string labelName = string.Format("h" + o.ToString() + "a");
    label = labels[labelName];
    label.Text = tnsop[o];
}

如果在构建字典时没有找到标签,上面的代码应该抛出 NullReferenceException


简化

我想我们可以做得更好。设计师将为您的标签创建字段,您只需将它们添加到字典中即可:

Dictionary<string, Label> labels;

// ...

labels = new Dictionary<string, Label>();
labels["h2a"] = h2a;
labels["h3a"] = h3a;
labels["h4a"] = h4a;
labels["h5a"] = h5a;

// ...

string[] tnsop = System.IO.File.ReadAllLines(@adqien);
for (int o = 2; o < 6; o++)
{
    string labelName = string.Format("h" + o.ToString() + "a");
    label = labels[labelName];
    label.Text = tnsop[o];
}

注意:有很多机会使用更现代的语法,包括集合初始化和 var 关键字。

附录:我在上面的代码中展开了循环,如果迭代次数少,这对于可维护性来说是可以的,实际上这是一个常见的优化。理论上,您也可以为另一个循环执行此操作。


PS。一个数组就可以了

我注意到,写完后,代码只需要通过一个int来查找o

我们可以重新使用 int 作为字典键:

Dictionary<int, Label> labels;

// ...

labels = new Dictionary<int, Label>();
labels[2] = h2a;
labels[3] = h3a;
labels[4] = h4a;
labels[5] = h5a;

// ...

string[] tnsop = System.IO.File.ReadAllLines(@adqien);
for (int o = 2; o < 6; o++)
{
    label = labels[o];
    label.Text = tnsop[o];
}

现在我们的连接更少了,代码也更简单了。

事实上,我们可以使用数组:

Label[] labels;

// ...

labels = new Label[4];
labels[0] = h2a;
labels[1] = h3a;
labels[2] = h4a;
labels[3] = h5a;

// ...

string[] tnsop = System.IO.File.ReadAllLines(@adqien);
for (int o = 2; o < 6; o++)
{
    label = labels[o - 2];
    label.Text = tnsop[o];
}

注意我确实偏移了索引以便能够使用索引 0 的数组。