2008-09-03 25 views
5

Tôi đang sử dụng điều khiển AutoComplete từ Bộ công cụ kiểm soát AJAX ASP.NET và tôi gặp sự cố trong đó AutoComplete không điền khi tôi đặt trọng tâm vào hộp văn bản được gán.Đặt tiêu điểm bằng Bộ công cụ kiểm soát AJAX ASP.NET

Tôi đã cố đặt tiêu điểm trong các sự kiện Page_Load, Page_PreRender và Page_Init và tiêu điểm được đặt đúng cách nhưng tính năng Tự động hoàn tất không hoạt động. Nếu tôi không đặt tiêu điểm, mọi thứ hoạt động tốt nhưng tôi muốn đặt nó để người dùng không có nhấp chuột bổ sung đó.

Có một địa điểm đặc biệt nào tôi cần để đặt tiêu điểm hay điều gì khác mà tôi cần làm để thực hiện tác phẩm này không? Cảm ơn.

Trả lời

3

Chúng tôi đã có chính xác cùng một vấn đề. Những gì chúng tôi phải làm là viết một kịch bản ở dưới cùng của trang nhanh chóng làm mờ, sau đó tái tập trung vào hộp văn bản. Bạn có thể xem giải pháp (terribly hacky) tại đây: http://www.drive.com.au

Id hộp văn bản là MainSearchBox_SearchTextBox. Có một cái nhìn về dòng 586 & bạn có thể thấy nơi tôi đang nối dây lên tất cả các sự kiện (tôi thực sự đang sử dụng nguyên mẫu cho bit này.

Về cơ bản sự kiện trọng tâm của hộp văn bản tôi đặt một biến toàn cầu được gọi là textBoxHasFocus true và trên các sự kiện mờ tôi đặt nó là false các trên các sự kiện load của trang tôi gọi kịch bản này:..

if (textBoxHasFocus) { 
    $get("MainSearchBox_SearchTextBox").blur(); 
    $get("MainSearchBox_SearchTextBox").focus(); 
} 

này reset hộp nó thực sự tinh ranh, nhưng đó là giải pháp duy nhất mà tôi có thể tìm thấy

+1

+1 để thừa nhận đó là một bản hack :) – edosoft

0

Bạn đặt tiêu điểm như thế nào? Tôi chưa thử trường hợp cụ thể mà bạn đã đề xuất, nhưng dưới đây là cách Tôi đặt trọng tâm vào các điều khiển của tôi:

Public Sub SetFocus(ByVal ctrl As Control) 
    Dim sb As New System.Text.StringBuilder 
    Dim p As Control 
    p = ctrl.Parent 
    While (Not (p.GetType() Is GetType(System.Web.UI.HtmlControls.HtmlForm))) 
     p = p.Parent 
    End While 
    With sb 
     .Append("<script language='JavaScript'>") 
     .Append("function SetFocus()") 
     .Append("{") 
     .Append("document.") 
     .Append(p.ClientID) 
     .Append("['") 
     .Append(ctrl.UniqueID) 
     .Append("'].focus();") 
     .Append("}") 
     .Append("window.onload = SetFocus;") 
     .Append("") 
     .Append("</script") 
     .Append(">") 
    End With 
    ctrl.Page.RegisterClientScriptBlock("SetFocus", sb.ToString()) 
End Sub 

Vì vậy, tôi không chắc bạn đang sử dụng phương pháp nào, nhưng nếu nó khác với tôi, hãy chụp và xem bạn có gặp sự cố hay không.

0

Điều tôi thường làm là đăng ký tập lệnh khách hàng để chạy phương thức setFocusTimeout dưới đây từ phương pháp mã hóa của tôi. Khi điều này chạy, nó chờ một lượng thời gian nhỏ và sau đó gọi phương thức thực sự tập trung (setFocus). Nó rất khủng khiếp, nhưng có vẻ như bạn phải đi một con đường như thế này để ngăn chặn AJAX lấy cắp sự tập trung của bạn.

function setFocusTimeout(controlID) { 
    focusControlID = controlID; 
    setTimeout("setFocus(focusControlID)", 100); 
} 

function setFocus() { 
    document.getElementById(focusControlID).focus(); 
} 
0

Tôi tìm thấy câu trả lời từ Glenn Slaven và từ Kris/Alex để làm cho tôi gần gũi hơn với một giải pháp cho vấn đề cụ thể của tôi với thiết tập trung vào một điều khiển ASP.NET TextBox rằng đã có một AutoCompleteExtender đính kèm. Các document.getElementById (focusControlID) .focus() tiếp tục ném một lỗi javascript ngụ ý document.getElementById đã trở về một đối tượng null. Biến focusControlID đã trả về giá trị ClientID đúng thời gian chạy cho điều khiển TextBox. Nhưng vì lý do gì đó, hàm document.getElementById không thích nó.

Giải pháp của tôi là ném jQuery vào hỗn hợp, vì tôi đã sử dụng nó để vẽ nền của bất kỳ điều khiển nào đã tập trung, cộng thêm phím Enter để chuyển qua biểu mẫu thay vì kích hoạt đăng lại.

My SetFocus chức năng đã kết thúc như thế này:

function setFocus(focusControlID) { 
    $('#' + focusControlID).blur(); 
    $('#' + focusControlID).focus(); 
} 

này đã thoát khỏi những lỗi thời gian chạy javascript, đặt trọng tâm vào các TextBox kiểm soát mong muốn, và đặt con trỏ trong tầm kiểm soát là tốt.Nếu không có mờ đầu tiên sau đó tập trung, kiểm soát sẽ được đánh dấu như thể nó đã tập trung, nhưng con trỏ sẽ không được ngồi trong kiểm soát được nêu ra. Người dùng sẽ vẫn phải nhấp vào bên trong bộ điều khiển để bắt đầu chỉnh sửa, điều này sẽ gây phiền toái cho UX.

Tôi cũng đã phải tăng thời gian chờ từ 100 đến 300. dặm của tôi khác nhau ...

Tôi đồng ý với tất cả mọi người rằng đây là một hack. Nhưng từ quan điểm của người dùng cuối, họ không thấy mã này. Các hack cho họ là nếu họ phải tự bấm vào bên trong kiểm soát thay vì chỉ được tự động đặt bên trong kiểm soát đã và gõ vài chữ cái đầu tiên để kích hoạt chức năng tra cứu tự động. Vì vậy, mũ ra cho tất cả những người cung cấp hack của họ.

Tôi hy vọng điều này hữu ích cho người khác.

1

đây là sự lãng phí, nó đơn giản

đây là những gì bạn cần làm

controlId.focus(); trong C# controlID.focus() trong VB

nơi này trong tải trang hoặc phần button_click

ví dụ. panel1.focus(); nếu panel1 có trình mở rộng mô hình bật lên được đính kèm, thì chúng tôi đặt mã này trong phần tải trang

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