2010-09-01 38 views
5

Có ai có một đoạn mã để thực hiện tất cả các điều khiển (hoặc thậm chí tất cả các hộp văn bản) trong một biểu mẫu chỉ đọc cùng một lúc mà không phải đặt mọi điều khiển để đọc- chỉ riêng lẻ?Thực hiện tất cả các điều khiển trên một biểu mẫu chỉ đọc cùng một lúc

+0

@Raulp Tôi không nghĩ rằng "đó là" là đúng ở đây. Biểu mẫu không phải là chỉ đọc, nhưng các điều khiển nên được. – Breeze

Trả lời

4

Trong Form:

if (_cached == null) 
{ 
    _cached = new List<TextBox>(); 

    foreach(var control in Controls) 
    { 
     TextBox textEdit = control as TextBox; 
     if (textEdit != null) 
     { 
      textEdit.ReadOnly = false; 
      _cached.Add(textEdit); 
     } 
    } 
} 
else 
{ 
    foreach(var control in _cached) 
    {    
     control .ReadOnly = false; 
    } 
} 

Add đệ quy cũng (Controls có thể được đặt vào các điều khiển khác (tấm)).

+0

Tôi cho rằng việc lưu trữ trong bộ nhớ cache sẽ tăng hiệu suất. Tuy nhiên, bạn sẽ phải xem xét việc cho phép người dùng làm mới bộ nhớ cache. Mã của bạn cũng không lặp qua các điều khiển lồng nhau (như các hộp văn bản được đặt bên trong các bảng). Nhìn chung, đó là một giải pháp tốt. –

+1

@Alex Essilfie Tôi đã viết: "Thêm đệ quy cũng" :), không có bất kỳ đề cập nào về tạo mã động để đặt lại _cache (xem "trong Biểu mẫu" không có biểu mẫu). Cảm ơn bạn. – garik

1
this.Enabled = false; 

Phụ thuộc vào những gì bạn thực sự làm, bạn có thể cân nhắc việc đặt điều khiển trong bảng điều khiển và tắt điều khiển đó.

3

Bạn sẽ có thể tự viết cho mình một chức năng tiện ích để thực hiện việc này. Bạn có thể lặp qua các điều khiển của biểu mẫu và sau đó mỗi kiểm soát của con điều khiển đệ quy. Ví dụ:

public static void SetEnableOnAllControls(Control parentControl, bool enable) 
{ 
    parentControl.Enabled = enable; 
    foreach (Control control in parentControl.Controls) 
     SetEnableOnAllControls(control, enable); 
} 

[...] 

// inside your form: 
SetEnableOnAllControls(this, false); 

Điều này không kiểm soát được ToolStrip s không kiểm soát. Bạn có thể viết một phương pháp riêng biệt, tương tự cho những người đó.

Lưu ý rằng ở trên cũng vô hiệu hóa biểu mẫu. Nếu bạn không muốn điều đó, hãy thử này:

public static void SetEnableOnAllChildControls(Control parentControl, bool enable) 
{ 
    foreach (Control control in parentControl.Controls) 
    { 
     control.Enabled = enable; 
     SetEnableOnAllChildControls(control, enable); 
    } 
} 

Nếu bạn thực sự có nghĩa là ReadOnly bất động sản, đó là chỉ thích hợp cho textbox, hãy thử này:

public static void SetReadOnlyOnAllControls(Control parentControl, bool readOnly) 
{ 
    if (parentControl is TextBoxBase) 
     ((TextBoxBase) parentControl).ReadOnly = readOnly; 
    foreach (Control control in parentControl.Controls) 
     SetReadOnlyOnAllControls(control, readOnly); 
} 
+0

Có thể đặt 'else' vào đoạn mã cuối cùng đó: các điều khiển' Hộp văn bản 'không phải là vùng chứa. –

+0

+1, câu trả lời toàn diện nhất. – Nobody

+0

bỏ phiếu xuống là một sự may mắn. – garik

2

tôi thiên đường' t đã thử nghiệm điều này, nhưng nó sẽ hoạt động:

foreach (var textBox in this.Controls.OfType<TextBox>()) 
    textBox.ReadOnly = true; 

Chỉnh sửa: Đây không phải là giải pháp tốt như vậy: xem nhận xét của Timwi.

+0

Chính xác nhất. Nhưng yêu cầu .NET 3.5 – abatishchev

+1

① Không tính đến các kiểm soát lồng nhau, tức là chỉ hoạt động trên các điều khiển cấp cao nhất; ② Nên sử dụng 'TextBoxBase' để nó cũng ảnh hưởng đến các điều khiển kiểu hộp văn bản khác (ví dụ:' RichTextBox'). – Timwi

+0

Điểm tốt Timwi, cảm ơn. – Nobody

6

Viết một phương pháp mở rộng mà tập hợp kiểm soát và điều khiển con của kiểu được chỉ định:

public static IEnumerable<T> GetChildControls<T>(this Control control) where T : Control 
{ 
    var children = control.Controls.OfType<T>(); 
    return children.SelectMany(c => GetChildControls<T>(c)).Concat(children); 
} 

Thu thập textbox về hình thức (sử dụng TextBoxBase ảnh hưởng đến RichTextBox, vv - @ giải pháp Timwi của):

IEnumerable<TextBoxBase> textBoxes = this.GetChildControls<TextBoxBase>(); 

Iterate qua bộ sưu tập và đặt chỉ đọc:

private void AreTextBoxesReadOnly(IEnumerable<TextBoxBase> textBoxes, bool value) 
{ 
    foreach (TextBoxBase tb in textBoxes) tb.ReadOnly = value; 
} 

Nếu muốn - sử dụng bộ nhớ đệm - giải pháp @ igor

+0

+1 Đây có vẻ là giải pháp có thể tái sử dụng nhiều nhất đối với tôi. – Niki

2

Tôi sẽ sử dụng sự phản chiếu để kiểm tra xem đối tượng Kiểm soát chung có thuộc tính Bật hay không.

private static void DisableControl(Control control) 
{ 
    PropertyInfo enProp = control.GetType().GetProperty("Enabled"); 
    if (enProp != null) 
    { 
     enProp.SetValue(control, false, null); 
    } 

    foreach (Control ctrl in control.Controls) 
    { 
     DisableControl(ctrl); 
    } 
} 
0

Tôi vừa phát triển một giải pháp đệ quy xử lý bất kỳ loại điều khiển web nào, sử dụng phương pháp tĩnh đơn giản và đa hình ASP.NET.

/// <summary> 
/// Handle "Enabled" property of a set of Controls (and all of the included child controls through recursivity) 
/// By default it disable all, making all read-only, but it can also be uset to re-enable everything, using the "enable" parameter 
/// </summary> 
/// <param name="controls">Set of controls to be handled. It could be the entire Page.Controls set or all of the childs of a given control (property "Controls" of any Control-derived class)</param> 
/// <param name="enable">Desired value of the property "enable" of each control. </param> 
public static void DisableControls(ControlCollection controls, bool enable = false) 
{ 
    foreach (Control control in controls) 
    { 
     var wCtrl = control as WebControl; 
     if (wCtrl != null) 
     { 
      wCtrl.Enabled = enable; 
     } 

     if (control.Controls.Count > 0) 
      DisableControls(control.Controls, enable); 
    } 
} 

/// <summary> 
/// Enable a set of Controls (and all of the included child controls through recursivity). 
/// Friendly name for DisableControls(controls, true), that achieve the same result. 
/// </summary> 
/// <param name="Controls">Set of controls to be handled. It could be the entire Page.Controls set or all of the childs of a given control (property "Controls" of any Control-derived class)</param> 
public static void EnableControls(ControlCollection controls) 
{ 
    DisableControls(controls, true); 
} 

Điều này được kiểm tra và trông khá nhanh (ít hơn một phần nghìn giây trong biểu mẫu web có 25+ kiểm soát bị tắt).

Nếu bạn thích một phương pháp mở rộng, tôi nghĩ rằng nó là đủ để thay đổi các giải pháp như sau:

public static void DisableControls(this Control control, bool enable = false) 
{ 
    foreach (Control ctrl in control.Controls) 
    { 
     var wCtrl = ctrl as WebControl; 
     if (wCtrl != null) 
     { 
      wCtrl.Enabled = enable; 
     } 

     if (ctrl.Controls.Count > 0) 
      ctrl.DisableControls(enable); 
    } 
} 

public static void EnableControls(this Control control) 
{ 
    control.DisableControls(true); 
} 
Các vấn đề liên quan