2008-09-03 71 views
5

我正在使用ASP.NET AJAX控件工具包中的AutoComplete控件,並且遇到了在將焦點設置爲分配的文本框時未填充自動填充的問題。使用ASP.NET AJAX控件工具包設置焦點

我已經嘗試在Page_Load,Page_PreRender和Page_Init事件中設置焦點並且焦點設置正確,但AutoComplete不起作用。如果我沒有設置焦點,一切正常,但我想設置它,以便用戶沒有額外的點擊。

是否有一個特殊的地方需要設置焦點或其他我需要做的工作?謝謝。

回答

3

我們有完全相同的問題。我們所要做的就是在頁面底部編寫一個腳本,該腳本很快模糊,然後重新調整到文本框。您可以在這裏看看(非常哈希)解決方案:http://www.drive.com.au

該文本框ID是MainSearchBox_SearchTextBox。看看線586 &你可以看到我接線的所有事件(我實際上使用原型爲這個位

基本上在文本框的焦點事件我設置了一個全局變量名爲textBoxHasFocus爲true,並在模糊事件中,我將它設置爲false時,在頁面的加載事件我把這個腳本:。

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

這將重置文本框,這真的很狡猾,但它是我能找到的唯一解決方案

+1

+1爲承認這是一個黑客:) – edosoft 2010-01-29 10:40:41

0

你是如何設定焦點的?我沒有嘗試過你建議的具體情況,但這裏是我將專注於我的控件:

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 

所以,我不知道你用什麼方法,但如果它是比我的不同,給這一個鏡頭,看看您是否仍然有問題,或者沒有。

0

我通常會做的是註冊一個客戶端腳本,以從我的codebehind方法運行下面的setFocusTimeout方法。當它運行時,它會等待一段時間,然後調用實際設置焦點的方法(setFocus)。這很糟糕,但似乎你必須走這樣的路線,以阻止AJAX竊取你的焦點。

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

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

我發現從格倫斯拉文和克里斯/亞歷克斯的答案,讓我更接近解決我的具體問題與上已經連接了一個AutoCompleteExtender一個ASP.NET TextBox控件設置焦點。 document.getElementById(focusControlID).focus()不斷拋出一個JavaScript錯誤,暗示document.getElementById返回一個空對象。 focusControlID變量正在爲TextBox控件返回正確的運行時ClientID值。但不管出於什麼原因,document.getElementById函數都不喜歡它。

我的解決方案是將jQuery引入混合中,因爲我已經使用它來繪製任何具有焦點的控件的背景,並且強制Enter鍵通過表單選項卡而不是發射回發。

我的setFocus功能結束這樣看:

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

這擺脫了JavaScript的運行時錯誤的,把重點放在所需的TextBox控件,並放置光標在控制範圍之內爲好。如果沒有先模糊然後對焦,控制器會突出顯示爲有焦點,但光標不會位於控制器中。用戶仍然需要在控件內部點擊才能開始編輯,這將是UX的煩惱。

我也不得不增加超時從100到300。您的里程我改變...

我同意大家的是,這是一個黑客。但從最終用戶的角度來看,他們沒有看到這個代碼。對他們來說,如果他們不得不手動點擊控件內部,而不是自動放置在控件中,並輸入前幾個字母來觸發自動查找功能。所以,所有誰提供了他們的黑客的帽子。

我希望這對別人有幫助。

1

這是浪費,它的簡單

這是你需要做的

controlId.focus()什麼;在VB

C# controlID.focus()

代替該網頁加載或button_click部

例如。 panel1.focus();如果panel1有附加的模型彈出擴展器,那麼我們把這個代碼放在頁面加載部分