Выберите все комбинированные поля в winform по LINQ [дубликат]

Отсортировано поле rev в обратном порядке, а затем сгруппировано по идентификатору, который дал первую строку каждой группы, которая является самой высокой величиной rev.

SELECT * FROM (SELECT * FROM table1 ORDER BY id, rev DESC) X GROUP BY X.id;

Проверено в http: //sqlfiddle.com/ со следующими данными

CREATE TABLE table1
    (`id` int, `rev` int, `content` varchar(11));

INSERT INTO table1
    (`id`, `rev`, `content`)
VALUES
    (1, 1, 'One-One'),
    (1, 2, 'One-Two'),
    (2, 1, 'Two-One'),
    (2, 2, 'Two-Two'),
    (3, 2, 'Three-Two'),
    (3, 1, 'Three-One'),
    (3, 3, 'Three-Three')
;

Это дало следующий результат в MySql 5.5 и 5.6

id  rev content
1   2   One-Two
2   2   Two-Two
3   3   Three-Two

31
задан drv 7 January 2011 в 22:18
поделиться

8 ответов

Использование бит LINQ:

foreach(var pb in this.Controls.OfType<PictureBox>())
{
  //do stuff
}

Однако это будет касаться только PictureBoxes в основном контейнере.

64
ответ дан Femaref 26 August 2018 в 17:56
поделиться

Вы можете использовать этот метод:

public static IEnumerable<T> GetControlsOfType<T>(Control root)
    where T : Control
{
    var t = root as T;
    if (t != null)
        yield return t;

    var container = root as ContainerControl;
    if (container != null)
        foreach (Control c in container.Controls)
            foreach (var i in GetControlsOfType<T>(c))
                yield return i;
}

Тогда вы можете сделать что-то вроде этого:

foreach (var pictureBox in GetControlsOfType<PictureBox>(theForm)) {
    // ...
}
21
ответ дан cdhowie 26 August 2018 в 17:56
поделиться

Если вы хотя бы на .NET 3.5, то у вас есть LINQ, это означает, что с ControlCollection реализовано IEnumerable вы можете просто сделать:

var pictureBoxes = Controls.OfType<PictureBox>();
7
ответ дан Dan Tao 26 August 2018 в 17:56
поделиться

Я использую этот общий рекурсивный метод:

Предположение об этом методе состоит в том, что если элемент управления T, чем метод не смотрит в его дочерние элементы. Если вам также нужно посмотреть на своих детей, вы можете легко его изменить.

public static IList<T> GetAllControlsRecusrvive<T>(Control control) where T :Control 
{
    var rtn = new List<T>();
    foreach (Control item in control.Controls)
    {
        var ctr = item as T;
        if (ctr!=null)
        {
            rtn.Add(ctr);
        }
        else
        {
            rtn.AddRange(GetAllControlsRecusrvive<T>(item));
        }

    }
    return rtn;
}
1
ответ дан giammin 26 August 2018 в 17:56
поделиться
    public static List<T> FindControlByType<T>(Control mainControl,bool getAllChild = false) where T :Control
    {
        List<T> lt = new List<T>();
        for (int i = 0; i < mainControl.Controls.Count; i++)
        {
            if (mainControl.Controls[i] is T) lt.Add((T)mainControl.Controls[i]);
            if (getAllChild) lt.AddRange(FindControlByType<T>(mainControl.Controls[i], getAllChild));
        }
        return lt;
    }
1
ответ дан Mohammad Fathi MiMFa 26 August 2018 в 17:56
поделиться

Это для меня самое легкое. В моем приложении я пытался очистить все текстовые поля в панели:

    foreach (Control c in panel.Controls)
    {
        if (c.GetType().Name == "TextBox")
        {
            c.Text = "";
        }
    }
0
ответ дан Richard Martin 26 August 2018 в 17:56
поделиться

Вот еще одна версия, так как существующие предоставленные были не совсем тем, что я имел в виду. Этот метод, возможно, работает как метод расширения и исключает проверку типа корневого / родительского контейнера. Этот метод в основном представляет собой метод «Получить все последующие элементы управления типа T»:

public static System.Collections.Generic.IEnumerable<T> ControlsOfType<T>(this System.Web.UI.Control control) where T: System.Web.UI.Control{
    foreach(System.Web.UI.Control childControl in control.Controls){
        if(childControl is T) yield return (T)childControl;
        foreach(var furtherDescendantControl in childControl.ControlsOfType<T>()) yield return furtherDescendantControl;
    }
}
2
ответ дан scradam 26 August 2018 в 17:56
поделиться

Простая функция, понятная, рекурсивная, и она вызывает ее в любом элементе управления:

private void findControlsOfType(Type type, Control.ControlCollection formControls, ref List<Control> controls)
    {
        foreach (Control control in formControls)
        {
            if (control.GetType() == type)
                controls.Add(control);
            if (control.Controls.Count > 0)
                findControlsOfType(type, control.Controls, ref controls);
        }
    }

Вы можете вызвать его несколькими способами. Чтобы получить кнопки:

List<Control> buttons = new List<Control>();
findControlsOfType(typeof(Button), this.Controls, ref buttons);

Чтобы получить панели:

List<Control> panels = new List<Control>();
findControlsOfType(typeof(Panel), this.Controls, ref panels);

и т. Д.

2
ответ дан Zelkovar 26 August 2018 в 17:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: