如何将文本分配给标签 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 的数组。
目标:
要写在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 的数组。