2016-09-10 3 views
-1

У меня есть этот код, и кажется, что он должен работать, но по какой-то причине он этого не делает.VisualStudio C# foreach on checkbox

foreach(Control c in Controls.OfType<CheckBox>()) {    
       Check_checked += 1; 
      } 

** Проверьте редактирование: Когда я пошагово код Контроль С подбирая все текстовые поля, но ничего.

Любая помощь будет оценена по достоинству.

** Я понимаю, что из типа не следует подбирать текст/метки/безотносительно.

Im получение текста/этикеток/безотносительно.

Я переместил свой код на другой компьютер, где также работает визуальная студия. Он не устанавливает флажки, и он, похоже, не пытается найти текст/ярлык/независимо от того, что в этой системе. Так что, я думаю, что одна из проблем - мой VS - подлец. Переустановит сейчас.

+0

Я думаю, что элемент управления Checkbox является дочерним элементом управления, поэтому он может быть на панели или что-то в этом роде. Таким образом, вам нужно выполнить итерацию родительского элемента управления, на котором установлены флажки или перебирать всех детей на всех элементах управления, чтобы найти все флажки. – Mayank

+0

Этот код четко выбирает элементы управления CheckBox, поэтому нет причин, по которым он должен выбирать элементы управления TextBox. Кроме того, эта переменная 'checked' невозможна .. это ключевое слово. –

+0

проверенная переменная на самом деле называется Check_checked Я просто переписал код снова в записи формы, чтобы сделать его меньше и немного легче читать. Я поправлю его на свое оригинальное, чтобы помочь. – GenGen

ответ

0

взгляд на следующий ответ

Get all controls of a specific type

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

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<CheckBox>(form)) { 

} 
+0

Как с помощью дженериков решить эту проблему? Проблема OP заключается в том, что код должен выбирать CheckBox, но вместо этого выбирает TextBox. –

+0

@GrantWinney: только что получил почту от товарища по работе, предлагая переустановить визуальную студию?Взял ему час, чтобы просмотреть код, и он не может понять, почему его взгляд на текстовые поля – GenGen

+1

@GrantWinney Я думаю, что его код не тот, что он описывает. Я думаю, что он получает TextBox, поскольку он просто перебирает Controls not Controls.OfType (который может быть пустым) – Mayank

0

Этот код представляет собой простое решение для подсчета флажков на форме, проверяются.

private int CountChecks(IEnumerable controls) 
    { 
     var result = 0; 
     foreach (Control xControl in controls) 
     { 

      if (xControl.HasChildren) result += CountChecks(xControl.Controls); 

      if (!(xControl is CheckBox)) continue; 
      if (!(xControl as CheckBox).Checked) continue; 
      result++; 
     } 
     return result; 
    } 

вы могли бы использовать это таким образом:

var howManyAreChecked = CountChecks(Controls); 

Это должно было бы быть в форме, чтобы использовать этот синтаксис. Чтобы правильно работать, вы должны передать формы Controls в метод.