Đố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.
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