ポストバック間でフォーカスを維持することは明らかに難しい作業です。 Googleを検索すると、同じことを望む大量の人々が見つかりますが、それはすべて異なっており、ほとんどがカスタムです。私はカスタム実装を避けたいと思います。特に、.NETでサポートされている方法がある場合はそうです。いくつかの非常に深い検索の後で、私はPostBackOptions.TrackFocusに出くわしました。別のスタックオーバーフローポストで静かに言及されました。 MSDNによると:。PostBackOptions.TrackFocusを使用してポストバック間で制御フォーカスを維持する
は、ポストバックイベントは、現在のスクロール位置にページを返し、現在のコントロールにフォーカスを返す必要があるかどうかを示す値を取得または設定し」
神聖ながらくたを、これはサポートされています私たちは何度もカスタムコントロールを持っていますが、.NETはコントロールにフォーカスを設定する方法をどのように知っていますか?わかりません.SMS.Web.UI.ControlのMSDNドキュメントを見ると、興味深い方法:
public virtual void Focus()
"Focusメソッドを使用して、Webページの初期フォーカスを コントロールに設定します。ページが選択されたコントロール ブラウザで開かれます。」
さてさて、明確にオーバーライド。しかし、そうすることの推奨方法は何ですか?それはvoidを返す。No例。人のいずれかの例を見つけることができません。ただし、オーバーライドして例外をスローするだけで、ASP.NETがポストバックの前にフォーカスを持つコントロールに焦点を当てる方法ではないことが明らかになります。呼び出されることはありません。
Firebugを使って大量のデバッグを行った結果、PostBackOptions.TrackFocusが有効になっていることが判明しました!時には、コントロールのフォーカスがコントロール__doPostBack JavaScriptメソッドを呼び出します。ポストバックを起動する他のコントロール(コントロール内でEnterキーを押したとき)は、ASPの非表示フィールド__LASTFOCUSを更新しないWebForm_OnSubmit()を呼び出します。 __doPostBackは、非表示フィールドを設定した後でWebForm_OnSubmit()を呼び出します。
これは私が現在立ち往生している場所です。まるで__doPostBackを呼び出すためにすべてを得る必要があるかのように見えます。 TrackFocusの使い方については、ごくわずかな文書しかありません。誰もここからのヒントを持っていますか?
私の問題は、私は__LASTFOCUSをコントロールしていないということです。私はそれを置かない:私はそれがクライアント側でスクリプトを書くことができるので私にそれを混乱させる権利を与えるものは、ASPによってどのように使用されているのかわからない? ASPが無作為にそれを取り除くとどうなりますか? (それはあなたにしたように)大丈夫です。マスターページに独自のカスタムlastfocus隠し要素を追加するだけでは、そのようにするのはなぜですか? –
もう1つ問題があります。ポストバック後にページにコントロールを追加することです。最後のフォーカスを非表示の要素に格納し、ポストバックします。ページにフォーカスを持ったコントロールの上にコントロールを動的に追加します。一意のClientIdが変更されました。そのIDは変更されたため、コントロールはフォーカスを維持しません。 –
@ Sam.Rueby私は、コントロールのIDがポストバックで変更されない限り、このメソッドはまだ動作するはずだと思いますか?特に、別の__LASTFOCUS隠しフィールドを作成する限りは、 注:すべてのページ読み込みでPage.SetFocus()を使用すると、__LASTFOCUSが存在し、尋ねられ、ここで回答されます。http://stackoverflow.com/questions/6684181/why-does-lastfocus-hidden-field-show-up-on- only-some-asp-net-pages –