Отсортировано поле 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
Использование бит LINQ:
foreach(var pb in this.Controls.OfType<PictureBox>())
{
//do stuff
}
Однако это будет касаться только PictureBoxes в основном контейнере.
Вы можете использовать этот метод:
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)) {
// ...
}
Если вы хотя бы на .NET 3.5, то у вас есть LINQ, это означает, что с ControlCollection
реализовано IEnumerable
вы можете просто сделать:
var pictureBoxes = Controls.OfType<PictureBox>();
Я использую этот общий рекурсивный метод:
Предположение об этом методе состоит в том, что если элемент управления 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;
}
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;
}
Это для меня самое легкое. В моем приложении я пытался очистить все текстовые поля в панели:
foreach (Control c in panel.Controls)
{
if (c.GetType().Name == "TextBox")
{
c.Text = "";
}
}
Вот еще одна версия, так как существующие предоставленные были не совсем тем, что я имел в виду. Этот метод, возможно, работает как метод расширения и исключает проверку типа корневого / родительского контейнера. Этот метод в основном представляет собой метод «Получить все последующие элементы управления типа 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;
}
}
Простая функция, понятная, рекурсивная, и она вызывает ее в любом элементе управления:
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);
и т. Д.