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
Trả lời
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)).
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. –
@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
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 đó.
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);
}
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.
Chính xác nhất. Nhưng yêu cầu .NET 3.5 – abatishchev
① 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
Điểm tốt Timwi, cảm ơn. – Nobody
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
+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
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);
}
}
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);
}
- 1. Tắt tất cả điều khiển biểu mẫu trên trang web
- 2. Một trình xử lý sự kiện cho tất cả các điều khiển trên biểu mẫu
- 3. Cách chuyển đổi tất cả các điều khiển trên biểu mẫu web aspx sang dạng chỉ đọc tương đương
- 4. Làm cách nào để hiển thị tất cả các lỗi xác thực HTML5 cùng một lúc?
- 5. Xác thực mẫu email cùng một lúc
- 6. Điều khiển không được rút ra cùng một lúc
- 7. Hibernate: Tránh đọc tất cả các bản ghi vào bộ nhớ cùng một lúc
- 8. Cách tốt nhất để xóa tất cả các điều khiển trên biểu mẫu C# là gì?
- 9. Kiểu cam kết Git: Tất cả các tệp đã thay đổi cùng một lúc hoặc một tệp cùng một lúc?
- 10. Làm cho tất cả các trường biểu mẫu chỉ đọc trong MVC
- 11. Xác nhận hợp lệ một số hộp văn bản trên biểu mẫu C# windows cùng một lúc
- 12. Cập nhật tất cả các ràng buộc trong UserControl cùng một lúc
- 13. Thêm cùng một nút vào tất cả các bộ điều khiển chế độ xem trong UINavigationController
- 14. Kích hoạt một nút mẫu và nút xử lý cùng một lúc?
- 15. Cách hiển thị thông báo lỗi xác thực biểu mẫu Ruby on Rails cùng một lúc
- 16. Hiện tất cả các file chứa cùng một partial class
- 17. Làm thế nào để animate một tập hợp các đối tượng jQuery cùng một lúc (thay vì tất cả cùng một lúc)
- 18. Nhiều bộ điều khiển chế độ xem trên màn hình cùng một lúc?
- 19. Làm thế nào để thực hiện kiểm tra lỗi trên nhiều tệp PHP cùng một lúc?
- 20. Có cách nào để setTitle trên UIButton cập nhật tất cả UIControlStates cùng một lúc không?
- 21. Làm cách nào để gửi tất cả các thẻ cùng một lúc?
- 22. Sử dụng cùng một bộ điều khiển trên các phần tử khác nhau để chỉ cùng một đối tượng
- 23. Đối với Java, tôi có thể nhập tất cả các gói cùng một lúc không?
- 24. Điều khiển biểu mẫu động
- 25. Phong cách tất cả các UITextField cùng một lúc chứ không phải trong mỗi ViewController?
- 26. Vòng qua tất cả các điều khiển trên một hình thức, ngay cả những người trong groupboxes
- 27. makefiles - biên dịch tất cả các tệp c cùng một lúc
- 28. Thực hành tốt nhất cho Rails để có cùng một biểu mẫu trên nhiều trang
- 29. Chuỗi Javascript regex /.*/gm không nắm bắt tất cả các dòng cùng một lúc
- 30. Làm thế nào để bạn tải lại tất cả các cửa sổ vim cùng một lúc?
@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