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# 循环遍历给定标签的数组的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历一个大数组并将值加在一起 ​​C#

PHP中如何使用foreach结构遍历数组?

c#如何遍历一个list将值传到数组

c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??

JS for循环遍历点击事件

C#中如何用for循环遍历List<类>?