2010-09-10 28 views
5

Có cách nào để tìm các điều khiển anh chị em trước đó và tiếp theo trong một biểu mẫu ASP.net từ mã phía sau, tương tự như findControl() không?Tìm các điều khiển anh chị em trước đó và tiếp theo

Đôi khi bạn không muốn chỉ định ID cho một điều khiển để bạn có thể thực hiện một parent(). FindControl ("ID") để tìm nó. Tôi đang mệt mỏi của đến với ID khi tất cả tôi có thể làm là previousControl() hoặc một cái gì đó (a la jQuery).

Điều này cũng hữu ích trong trường hợp bạn viết chức năng chung để xử lý một số điều khiển có bố cục tương tự và không muốn giải quyết chúng từng cái một.

Cảm ơn mọi đề xuất.

Trả lời

6

Đối với hậu thế, đây là chức năng tôi đã kết thúc bằng văn bản. Hoạt động rất tốt (thử nghiệm trong một dự án thực tế):

public static Control PreviousControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) - 1; i >= 0; i--) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

Để được sử dụng như thế này:

Control panel = textBox.PreviousControl(); 

và để kiểm soát tiếp theo:

public static Control NextControl(this Control control) 
    { 
     ControlCollection siblings = control.Parent.Controls; 
     for (int i = siblings.IndexOf(control) + 1; i < siblings.Count; i++) 
     { 
      if (siblings[i].GetType() != typeof(LiteralControl) && siblings[i].GetType().BaseType != typeof(LiteralControl)) 
      { 
       return siblings[i]; 
      } 
     } 
     return null; 
    } 

Ưu điểm của giải pháp này trên đó của Atzoya là, đầu tiên, bạn không cần sự kiểm soát ban đầu để có một ID kể từ khi tôi thực hiện tìm kiếm dựa trên cá thể. Thứ hai, bạn phải biết rằng ASP.net tạo ra một số điều khiển bằng chữ để hiển thị HTML tĩnh của bạn giữa các điều khiển "thực" của bạn. Đó là lý do tại sao tôi bỏ qua chúng, hoặc bạn sẽ giữ cho phù hợp với rác. Tất nhiên nhược điểm của điều này là bạn không thể tìm thấy một điều khiển nếu đó là một Literal. Giới hạn này không phải là một vấn đề trong việc sử dụng của tôi.

1

Tôi không nghĩ rằng có một xây dựng trong chức năng như vậy, nhưng nó là rất dễ dàng để mở rộng các lớp kiểm soát và thêm các phương pháp để nó như vậy:

public static Control PreviousControl(this Control control) 
{ 
    for(int i=0; i<= control.Parent.Controls.Count; i++) 
     if(control.Parent.Controls[i].Id == control.Id) 
     return control.Parent.Controls[i-1]; 
} 

Dĩ nhiên hơn một chút nhu cầu xử lý được thực hiện ở đây (nếu không có điều khiển trước đó hoặc các kịch bản khác) nhưng tôi nghĩ bạn sẽ có được hình ảnh về cách thực hiện điều này.

Sau khi viết phương pháp này, bạn có thể gọi nó như

Control textBox1 = textBox2.PreviousControl(); 
+3

Cảm ơn bạn đã đề xuất nhưng có 2 vấn đề: trước tiên bạn cho rằng điều khiển ban đầu phải có ID, điều này không tốt trong trường hợp của tôi. Thứ hai, chức năng của bạn sẽ phù hợp với các điều khiển Literally ASP.net tạo ra để xuất HTML tĩnh của bạn. Đó là một không đi. Xem giải pháp của riêng tôi cho một phiên bản giải quyết tất cả những điều đó. – md1337

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