2011-07-01 27 views
3

在發佈信息時保持焦點顯然是一項艱鉅的任務。搜索谷歌,你會發現很多人都渴望同樣的事情,但都以不同的方式掛鉤,而且大多數都是定製的。我想避免一個自定義的實現,特別是如果有一種.NET支持的方式。只有經過一些非常深入的搜索之後,我才遇到PostBackOptions.TrackFocus,在另一個堆棧溢出帖子中悄然提到。根據MSDN:使用PostBackOption維護對發佈信息的控制焦點.TrackFocus

獲取或設置指示回發事件是否應該返回頁面以當前的滾動位置,焦點返回到電流控制值「

哇靠,這是支持的。我們有很多自定義控件,.NET如何知道如何將焦點放在控件上?我不知道。查看System.Web.UI.Control的MSDN文檔,一個有趣的方法:

public virtual void Focus() 

」使用Focus方法將網頁的初始焦點設置爲 控件。該頁面將在瀏覽器選擇的控制 被打開。」

好吧,明確覆蓋的,但這樣做有什麼推薦的方法是什麼?它返回void,沒有例子。無法找到的人的任何實例但是,在覆蓋它並且除了拋出一個異常之外別無它物,這顯然不是ASP.NET如何專注於在回發之前關注的控件:它永遠不會被調用。

經過大量使用Firebug的調試後,我發現啓用PostBackOptions.TrackFocus有效!有時很明顯,控件的焦點只有在控件調用__doPostBack JavaScript方法。其他啓動PostBack的控件(當按下控件內部的按鈕時),調用WebForm_OnSubmit(),它不更新ASP隱藏字段__LASTFOCUS。 __doPostBack在設置隱藏字段後調用WebForm_OnSubmit()。

這是我目前卡住的地方。看起來好像我需要讓所有東西都調用__doPostBack,無論如何。有關使用TrackFocus的文檔非常少。那麼有沒有人有從這裏的任何提示?

回答

1

我一直保持焦點翻過使用本文中的方法回傳: (即:商店焦點__LASTFOCUS隱藏字段的字段中輸入所有控件事件客戶方)

​​

如果」已經得到__LASTFOCUS顯示在頁面上,這應該讓你的大部分剩餘的方式...

注意:這將是很好找到一種方法來保持額外的JavaScript從膨脹__VIEWSTATE例如。

它工作得很好,直到我發現我的一些網頁包含隱藏的__LASTFOCUS字段,而我的一些網頁沒有。 (這是什麼促使我搜索周圍,並找到你的問題)現在我只是想弄清楚如何確保__LASTFOCUS總是顯示在每一頁我想跟蹤重點...(看起來像我會必須打開一個關於它的單獨問題)

+0

我這個問題是我無法控制__LASTFOCUS。我沒有把它放在那裏:我不知道ASP如何使用它,只是因爲我能夠在客戶端編寫腳本,是什麼讓我有權惹上它?如果ASP隨機將它拿走,會發生什麼? (就像它對你)不好。爲什麼不直接添加自己的自定義lastfocus隱藏元素,如果你打算這樣做呢? –

+0

還有一個問題:在回發後向頁面添加控件。將最後一個焦點存儲在隱藏元素中,然後回傳。在控件上動態添加一個控件,該控件具有焦點在頁面上:現在唯一的ClientId已更改,因爲其ID已更改,您的控件將無法保持焦點。 –

+0

@ Sam.Rueby我會認爲,只要控件的ID不會在帖子後面發生變化,這種方法應該仍然有效?特別是如果你去創建一個單獨的__LASTFOCUS隱藏字段。 注意:所有頁面加載中的Page.SetFocus()都將確保__​​LASTFOCUS存在,在此處詢問並回答:http://stackoverflow.com/questions/6684181/why-does-lastfocus-hidden-field-show-up-on-只有幾家,ASP淨頁 – 2011-07-20 13:10:23

0

這就是我剛剛做的。假設你有一個處理程序在你的代碼背後,是以事件的關懷和具有這樣的特徵:

protected void myEventHandler(object sender, EventArgs e) 

您可以使用此行代碼將焦點還原到發送對象:

 ScriptManager.RegisterStartupScript((WebControl) sender, sender.GetType(), "RestoreFocusMethod", "document.getElementById(\"" + ((WebControl) sender).ClientID + "\").focus();", true); 

只需使用發送控件的Focus()方法就可以重新定位頁面(如果向下滾動一下),但這種方式很好用。如果你有具體的處理程序的控制,你可以使用該控件本身,而不是鑄造發送到WebControl的,就像這樣:

protected void CityListDropDown_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ... 
     ScriptManager.RegisterStartupScript(CityListDropDown, CityListDropDown.GetType(), "CityDropDownRefocus", "document.getElementById(\"" + CityListDropDown.ClientID + "\").focus();", true); 
    }