2013-09-18 2 views
2

внутримышечно зацикливание 24 PictureBox на GroupBox для отображения что-то, но это не петля в правильном порядке, он может начать на 18-м поле изображения и вот код им с помощьюзацикливание на родительских элементов управления в порядке

foreach (var pb in groupBox1.Controls) 
{ 
    if (pb is PictureBox && previewIndexer < Previewer.Count) 
    { 
     try 
     { 
      ((PictureBox)pb).Image = ... 
      previewIndexer++; 
      ... 
     } 
     catch 
     { 
      ... 
     } 
    } 
} 

я хотел бы цикл в порядке возрастания которого петлю на picturebox1 первых до picturebox24, спасибо и есть замечательный день

+1

Откуда вы знаете, что это '18-я фотография?? по его названию? –

+1

Как вы можете сказать по возрастанию? Я имею в виду, как вы продолжаете индексирование? – Muctadir

+0

@kingking по его названию и положению, фотографии там с оригинальным порядком именования, вот почему я ожидаю, что он будет закодирован в порядке, чтобы он отображал их в порядке –

ответ

0

Ваша проблема заключается в упорядочивании элементов управления по имени. Вам нужна алфавитно-цифровая сортировка, чтобы picturebox10 пойти после picturebox5. Это может быть сделано, если вы будете сортировать PictureBoxes по номерам в их названиях:

foreach (var pb in groupBox1.Controls.OfType<PictureBox>() 
       .OrderBy(x => Int32.Parse(x.Name.Substring("picturebox".Length)))) 
{ 
    pb.Image = ...; 
} 

Я бы даже создал какой-то способ, как (она удаляет все не-цифровые символы из названия управления и пытается разобрать остальные целое значение):

private int GetControlId(Control control) 
{ 
    int id; 
    string idToParse = Regex.Replace(control.Name, @"\D+", ""); 
    return Int32.TryParse(idToParse, out id) ? id : 0; 
} 

И использовали этот метод в запросе

var pictureBoxes = groupBox1.Controls.OfType<PictureBox>(); 

foreach (var pb in pictureBoxes.OrderBy(GetControlId)) 
{ 
    pb.Image = ...; 
}  
+2

^и это дамы и господа - это один про программист XD, который был действительно умным, linq - это потрясающе, так что вы XD спасибо, примет его как можно раньше –

0

вы можете извлекать выгоду из LINQ здесь, предположите, что вы назвали ваши PictureBoxes, как picture1, picture2, .. .

foreach (var pb in groupBox1.Controls.OfType<PictureBox>().OrderBy(p=>int.Parse(Regex.Replace(k,"\\D*","")))) 
{ 
    if(previewIndexer < Previewer.Count) { 
       try 
       { 
        ((PictureBox)pb).Image = ... 
        previewIndexer++; 
        ... 
       } 
       catch 
       { 
        ... 
       } 
     } 
} 
0

Вы можете индексировать свойство Controls со строкой, которая ссылается на имя элемента управления. Это может быть самое простое решение:

for (int i = 1; i <= 24; i++) 
{ 
    PictureBox pb = groupBox1.Controls["picturebox" + i.ToString()] as PictureBox; 
} 
+1

True ... но вместо ' Controls', вы должны использовать 'groupBox1.Controls'. Если PictureBoxes были распространены в нескольких контейнерах, вы можете использовать 'this.Controls.Find()'. –

+0

@Idle_Mind Хорошо, я изменил источник примера в соответствии с groupBox, хотя он ничего не меняет. Метод Find() выглядит интересным, хотя, как я понимаю, все элементы управления OP находятся в одном контейнере groupBox. – toderik

Смежные вопросы