Linq To Select All элементы управления, где DI содержит текст из ControlCollection - PullRequest
0 голосов
/ 12 апреля 2020

Линк всегда сбивал меня с толку. Я пытаюсь извлечь все элементы управления со страницы формы ASP. Net, где идентификатор элемента управления содержит указанную строку c. Коллекция элементов управления является иерархической, и я хочу вернуть все соответствующие элементы управления со всех уровней. Я где-нибудь на стадионе здесь? Я мог бы действительно использовать некоторую помощь / образование. Параметр collection - это набор элементов управления со страницы, а controlID - текст, который я ищу.

    public static Control FindControlsByControlID(ControlCollection collection, string controlID)
    {
        IEnumerable<Control> controls = collection.Cast<Control>();
        IEnumerable<Control> matchedControls = controls
            .SelectMany(p => p.Controls.Cast<Control>()
                .SelectMany(c => c.Controls.Cast<Control>())
                .Where(d => d != null ? d.ID != null ? d.ID.Contains(controlID) : false : false))
            .Where(a => a != null ? a.ID != null ? a.ID.Contains(controlID) : false : false);

        ConcurrentQueue<Control> cq;
        if (matchedControls != null)
            cq = new ConcurrentQueue<Control>(matchedControls);
        else
            return null;
        ...

Заранее спасибо!

1 Ответ

0 голосов
/ 13 апреля 2020

Используйте метод расширения, чтобы получить все дочерние элементы управления:

public static class ControlExt {
    public static IEnumerable<Control> AndSubControls(this Control aControl) {
        var work = new Queue<Control>();
        work.Enqueue(aControl);
        while (work.Count > 0) {
            var c = work.Dequeue();
            yield return c;
            foreach (var sc in c.Controls.Cast<Control>()) {
                yield return sc;
                if (sc.Controls.Count > 0)
                    work.Enqueue(sc);
            }
        }
    }
}

Теперь вы можете проверить все подчиненные элементы управления в вашем ControlCollection:

IEnumerable<Control> matchedControls = controls.SelectMany(c => c.AndSubControls())
                                               .Where(a => a != null && a.ID != null && a.ID.Contains(controlID));
...