C# 循环遍历给定标签的数组
Posted
技术标签:
【中文标题】C# 循环遍历给定标签的数组【英文标题】:C# loop through an array of given labels 【发布时间】:2011-12-09 03:40:37 【问题描述】:这对我来说有点难以描述,但是这个伪 C# 应该可以解释我想要做什么。
windows窗体上有大量的标签。
我想更改其中一些标签的文本颜色。
private void allBlackLabels()
int[] lray = 1, 2, 3, 5, 6 ;
foreach (int i in lray)
label[i].Forecolor = Color.Black;
我希望这能解释我在这里想要做什么。
现在很明显,由于标签[i],它不会工作,但我该如何解决这个问题?
【问题讨论】:
为什么它“显然由于标签[i]而无法工作”?我们是否应该假设您目前无法方便地使用您的标签?这里真正的问题是“我如何从表单中获取所有标签,并以label17
形式的名称键入?” ?
【参考方案1】:
它可能不起作用,因为您的标签未保存在数组中。考虑到您知道要更改的标签名称,以下代码将起作用:
Label[] lray = labelOne, labelDifferent, labelWhatElse ;
foreach (Label label in lray)
label.ForeColor = Color.Black;
【讨论】:
这太完美了,谢谢!为什么我要走我永远不会知道的路线!谢谢先生。【参考方案2】:如果你真的有一个标签数组,那会很好用。
如果你只有很多变量,像这样:
private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Label label5;
那就更难了。选项:
更改代码以改用数组。设计师没有那么好,但更合乎逻辑 对每个 ID 使用Controls.Find
遍历Controls
以查找所有 Label
控件,无论名称如何
【讨论】:
【参考方案3】:foreach (Control c in this.Controls)
if (c is Label)
// do stuff
这将获取表单的所有子控件(前提是此代码在表单的代码隐藏中)并检查它们是否为标签。只需执行您想要的任何操作来代替评论即可。
【讨论】:
我个人会在那里使用 LINQ:foreach (Label label in this.Controls.OfType<Label>())
但这会改变所有标签,而tripbrock只想改变其中的一部分。【参考方案4】:
您可以自己创建数组。每次您的表单更改时,这都会涉及一些维护成本/风险。注意:您可能希望将数组创建位放在 Form Loaded 事件中,而不是在构造函数中,或者至少在 InitializeComponent
调用之后,以便设置您的控件。
或者您可以迭代表单的所有子项(来自 Form 方法的this.Controls
),使用特定标签标记您的标签,或者如果这是您的目的,则获取所有标签。
请注意,如果表单中有许多控件,第一个解决方案在运行时性能方面可能要快得多。
【讨论】:
如果您在设计器中为标签提供相同的名称,它会为您创建一个数组——那么就没有真正的机会弄错了。 编辑:嗯,至少你曾经能够做到。 @KristianFenn 有趣。不过,这可能涵盖也可能不涵盖 OP 的用例。例如,根据某些运行时属性,他可能有两组不同的标签。【参考方案5】:private void allBlackLabels()
int[] lray = 1, 2, 3, 5, 6 ;
foreach (int i = 0; i < lray.Length; i++)
((Label)this.Controls["label" + i]).ForeColor = Color.Black;
【讨论】:
【参考方案6】:如果您想为表单上的所有标签实现这一点,那么这样的事情可能会有所帮助:
foreach (Control control in this.Controls)
if (control is Label)
(control as Label).Forecolor = Color.Black;
但是,如果您只需要更改所有标签的子集,那么您需要存储需要更改的标签的名称或索引。这是因为this.Controls
有两个索引器,一个 int32 和一个字符串。因此你可以尝试这样的事情
private void allBlackLabels()
int[] lray = 1, 2, 3, 5, 6 ;
foreach (int i in lray)
this.Controls[i].Forecolor = Color.Black;
值得注意的是,this.Controls
中的排序很可能不像 lray
数组那样线性。
希望这会有所帮助
【讨论】:
希望所有控件都直接在最外层的控件/表单上,而不是嵌套...【参考方案7】:试试这样的:
List<string> ListLabelNames = new List<string>() /* Your label name list*/ ;
foreach (Label TmpLabel in this.Controls.OfType<Label>())
foreach (string strTmp in ListLabelNames)
if (String.Compare(TmpLabel.Name, strTmp, true) == 0)
TmpLabel.ForeColor = System.Drawing.Color.Black;
希望这会有所帮助。
【讨论】:
【参考方案8】:我注意到您在示例中从“lray”数组中排除了 4。如果您希望排除一个或多个标签不被代码自动更新(可能突出显示一组中的一个),试试这个。
private void allBlackLabels()
foreach (Control control in this.Controls)
if (control is Label && control.Name != "label4")
(control as Label).Forecolor = Color.Black;
【讨论】:
【参考方案9】:在伪 C# 中:
List<String> controlsToChange =new List<String>"lable1Name","lable2Name";
foreach(Control control in form.Controls)
if(control.GetType().Equals(typeof(Lable))
if( controlsToChange.Contains(control.Name)
control.Forecolor=Colour.Black;
【讨论】:
但这会改变所有标签,而tripbrock只想改变其中的一部分。 @Fischermaen,真的吗?还是只会更改在 controlsToChange 列表中有条目的那些? 不,它只会改变List
中指定的标签。
@SamHolder:你是对的。对不起!如果你有一个 List
@Fischermaen 确实你是对的,你可以保存测试。您可以删除否决票吗?以上是关于C# 循环遍历给定标签的数组的主要内容,如果未能解决你的问题,请参考以下文章