3

ポストバック全体でフォーカスを維持することは、明らかに難しい作業です。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 の使用に関するドキュメントはほとんどありません。ここから何かヒントはありますか?

4

2 に答える 2

1

この記事の方法を使用して、ポストバック全体でフォーカスを維持してきました: (つまり、すべてのコントロールのフィールド入力イベント クライアント側の __LASTFOCUS 非表示フィールドにフォーカスを格納します)

http://www.codeproject.com/KB/aspnet/MainatinFocusASPNET.aspx

__LASTFOCUS がページに表示されるところまで到達した場合、これで残りのほとんどを取得できるはずです...

注: たとえば、余分な JavaScript が __VIEWSTATE を肥大化させないようにする方法を見つけるとよいでしょう。

一部のページには非表示の __LASTFOCUS フィールドが含まれていて、一部のページには含まれていないことがわかるまで、それはかなりうまく機能していました。(それが私を検索してあなたの質問を見つけるように促したものです)今、私はフォーカスを追跡したいすべてのページに__LASTFOCUSが常に表示されるようにする方法を見つけようとしています...(私はそうするようですそれについて別の質問を開く必要があります)

于 2011-07-13T18:52:41.120 に答える
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);
    }
于 2016-04-05T15:49:25.197 に答える