2009-11-24 34 views

Trả lời

36
foreach(Control c in this.Controls) 
{ 
    if(c is CheckBox) 
    { 
    // Do stuff here ;] 
    } 
} 
+1

Không hoạt động nếu các điều khiển được nhúng bên trong các điều khiển khác. "này" không phải là tất cả. – Fandango68

+0

Có @ Fernando68 bạn sẽ phải tạo ra một chức năng lặp lại mà đi qua tất cả các 'trẻ em'. Đây là câu trả lời từ gần 8 năm trước: D –

+0

Có, nó không hoạt động –

1

Khi chúng được tạo, hãy lấy danh sách tham chiếu đến giá trị và sau đó bạn có thể lặp qua danh sách.

8

Như thế này, có lẽ (nếu đó là trong Windows Forms):

foreach(var checkBox in myForm.Controls.OfType<CheckBox>()) 
{ 
    //Do something. 
} 
+2

Tôi đã làm việc này một thời gian - miễn là tôi biết không có tổ trong thùng chứa. Bạn có thể đề cập rằng giải pháp của bạn cũng cho phép một .Where (c => c.Checked) (hoặc biểu thức LINQ khác) được nối thêm vào để không biết. – Herb

11

Nếu đó là Windows Forms, bạn có thể thử một cái gì đó như thế này:

private void button1_Click(object sender, EventArgs e) 
{ 
    Dictionary<string, bool> checkBoxes = new Dictionary<string, bool>(); 
    LoopControls(checkBoxes, this.Controls); 
} 

private void LoopControls(Dictionary<string, bool> checkBoxes, Control.ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     if (control is CheckBox) 
      checkBoxes.Add(control.Name, ((CheckBox) control).Checked); 
     if (control.Controls.Count > 0) 
      LoopControls(checkBoxes, control.Controls); 
    } 
} 

Hãy nhớ rằng điều khiển container có thể chứa trẻ em, vì vậy bạn cũng có thể muốn kiểm tra chúng.

14

tôi sử dụng một phương pháp mở rộng đơn giản mà sẽ làm việc cho bất kỳ loại điều khiển:

public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control 
    { 
    bool hit = startingPoint is T; 
    if (hit) 
    { 
     yield return startingPoint as T; 
    } 
    foreach (var child in startingPoint.Controls.Cast<Control>()) 
    { 
     foreach (var item in AllControls<T>(child)) 
     { 
      yield return item; 
     } 
    } 
    } 

Sau đó, bạn có thể sử dụng nó như vậy:

var checkboxes = control.AllControls<CheckBox>(); 

Sử dụng IEnumerable cho phép bạn chọn cách lưu trữ kết quả, và cũng cho phép bạn sử dụng linq:

var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked); 
+0

+1 chúng có thể được lồng nhau, điểm tốt và sử dụng lambdas luôn là dấu cộng) –

+0

Điều này có thể hữu ích hơn Control.Controls –

+0

+1 Để tìm các điều khiển lồng nhau. Câu trả lời này là câu trả lời hay nhất. –

0

Tôi biết rằng điều này là cũ, nhưng thật dễ dàng như tôi có thể ima gine.

Chỉ cần thêm tất cả các hộp kiểm vào List<Checkbox>, tất cả trạng thái hộp kiểm nằm trong danh sách và ngay cả khi chúng thay đổi trong giao diện người dùng trong danh sách cũng thay đổi.

List<Checkbox> checkboxes = new List<Checkboxes>(); 
checkboxes.Add(chk1); 
checkboxes.Add(chk2); 
//So add all checkboxes you wanna iterate 

foreach(Checkbox checkbox in checkboxes){ 
    //Do something using checkbox object 
} 

Hope this helps :)

Các vấn đề liên quan