C# lista użytych labeli

0

Witam.
Mam taką apkę:

user image

Kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace testy2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            foreach (Label tb in this.Controls.OfType<Label>())
            {
                MessageBox.Show(tb.Name);

            }
        }
    }
}

Chciałbym, aby po kliknięciu przycisku wyświetliła mi się nazwa użytych labeli(czyli w sumie 3).
Niestety teraz dostaję tylko jeden- [b]label3[/b]
Dzieje się tak dlatego, że label2 i label1 są w GroupBoxie1;

Oczywiście mógłbym zrobić taki kod:

private void button1_Click(object sender, EventArgs e)
        {
            foreach (Label tb in this.Controls.OfType<Label>())
            {
                MessageBox.Show(tb.Name);

            }
/////////////
      foreach (Label tb in groupBox1.Controls.OfType<Label>())
            {
                MessageBox.Show(tb.Name);

            }
        }

Ale czy nie da się jakoś zrobić tego za jednym zamachem?

0

Można spróbować zrobić to rekurencyjnie, tj. w pętli która znajduje się w danej funkcji sprawdzać czy trafiliśmy na element z dziećmi, jeżeli tak to wywołujemy funkcje działającą z tym podzbiorem. I tak będzie to działać aż nie sprawdzi wszystkich elementów z formatki. Przykładu nie dam bo z nokii pisze, może później.

0

byłbym wdzięczny :)

1
        void SzukajLabeli(Control parent, List<Label> results)
        {
            foreach (Control c in parent.Controls)
            {
                if (c is Label)
                    results.Add((Label)c);
                else
                    SzukajLabeli(c, results);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var labele = new List<Label>();
            SzukajLabeli(this, labele);
            foreach (Label l in labele)
            {
                textBox1.AppendText(Environment.NewLine);
                textBox1.AppendText(l.Text);
            }
        }
2

Można też nieco uprościć stosując OfType i nie przekazując kolekcji z zewnątrz:

private void button1_Click(object sender, EventArgs e)
{
    var labels = GetAllLabels(this);
    var message = string.Join(Environment.NewLine, labels.OrderBy(x => x.Name).Select(x => x.Name));
    MessageBox.Show(message);
}

private static IEnumerable<Label> GetAllLabels(Control root)
{
    var allLabels = new List<Label>();
    allLabels.AddRange(root.Controls.OfType<Label>());
    foreach (Control control in root.Controls)
        allLabels.AddRange(GetAllLabels(control));

    return allLabels;
}
0
 
 private void button1_Click(object sender, EventArgs e)
        {
            var ctrl = GetAllLabelControls(this);
 
            foreach (Label lbl in ctrl)
            {
                MessageBox.Show(lbl.Name);
            }
 
        }
 
        private IEnumerable<Control> GetAllLabelControls(Control container)
        {
            List<Control> controlList = new List<Control>();
            foreach (Control ctrl in container.Controls)
            {
                controlList.AddRange(GetAllLabelControls(ctrl));
                if (ctrl is Label)
                    controlList.Add(ctrl);
            }
            return controlList;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1