ポストバック全体でフォーカスを維持することは、明らかに難しい作業です。Googleで検索すると、同じことを望んでいる人がたくさんいますが、それらはすべて異なっており、ほとんどがカスタムです. 特に.NETでサポートされる方法がある場合は、カスタム実装を避けたいと思います。非常に詳細な検索を行った後で初めて、別のスタック オーバーフローの投稿で静かに言及されている PostBackOptions.TrackFocus に出会いました。MSDNによると:
ポストバック イベントがページを現在のスクロール位置に戻し、フォーカスを現在のコントロールに戻すかどうかを示す値を取得または設定します。"
なんてこった、これは.NET 4でサポートされていますか? 驚くばかり。しかし、大量のカスタム コントロールがありますが、.NET はコントロールにフォーカスを設定する方法をどのように知っているのでしょうか? 何も思いつきません。System.Web.UI.Control の MSDN ドキュメントを見ると、興味深い方法があります。
public virtual void Focus()
"Focus メソッドを使用して、Web ページの最初のフォーカスをコントロールに設定します。コントロールが選択された状態でページがブラウザーで開かれます。"
わかりました、明らかにオーバーライド可能です。しかし、そうするために推奨される方法は何ですか?void を返します。例はありません。実装でこのメソッドをオーバーライドしている人々の例を見つけることができません。ただし、それをオーバーライドして例外をスローするだけで、ポストバックの前にフォーカスを持っていたコントロールに ASP.NET がフォーカスを当てる方法ではないことが明らかになりました。つまり、呼び出されることはありません。
Firebug を使用して大量のデバッグを行った後、PostBackOptions.TrackFocus を有効にすると機能することがわかりました。時々。コントロールのフォーカスが維持されるのは、コントロールが __doPostBack JavaScript メソッドを呼び出す場合だけであることは明らかです。PostBack を起動するその他のコントロール (コントロール内で Enter キーを押すと) は WebForm_OnSubmit() を呼び出しますが、これは ASP 隠しフィールド __LASTFOCUS を更新しません。__doPostBack は、隠しフィールドを設定した後に WebForm_OnSubmit() を呼び出します。
これは私が現在立ち往生しているところです。何があっても、__doPostBack を呼び出すにはすべてを取得する必要があるようです。TrackFocus の使用に関するドキュメントはほとんどありません。ここから何かヒントはありますか?