4

他のコントロールをラップする UpdatePanel を含む UserControl があります。UserControl は、ScriptManager が既にある一部のページと、ScriptManager がない他のページで使用されます。UserControl が独自の ScriptManager を持っていない場合は、自動的に持ってくるようにしたいと思います。

ScriptManager.GetCurrent を試してみましたが、null が返された場合は、独自の ScriptManager を作成してフォームに挿入しますが、UserControl のライフサイクルの早い段階でこのコードを実行する場所を見つけることができません。「ID 'uPnlContentList' のコントロールには、ページに ScriptManager が必要です。ScriptManager は、それを必要とするすべてのコントロールの前に表示する必要があります。」というエラーが表示され続けます。ページを読み込もうとするたびに。コードを実行しようとした場所は、OnInit、CreateChildControls、および PageLoad であり、到達する前に終了するため、呼び出されることはありません。

この小切手はどこに置くべきですか?

4

5 に答える 5

11

すべての ASPX ファイルが参照する MasterPage に ScriptManager を配置します。次に、ScriptManager を操作する必要があるサイト内の他の場所では、マスター ページから ScriptManager を取得する ScriptManagerProxy を使用し、ユーザー コントロールとコード ビハインドで操作できるようにします。

ここで ScriptManager.GetCurrent(Page) を呼び出すと、スクリプト マネージャーへの参照が提供されます。

<asp:ScriptManagerProxy>
  <Scripts>
    <asp:ScriptReference Path="~/Scripts/myscript.js" />
  <Scripts>
</asp:ScriptManagerProxy>

ここにリンクがあります:

MSDN 情報

于 2009-03-16T16:21:09.077 に答える
2

これについて別の方向に進むのは嫌ですが、マスターページを使用していますか? もしそうなら、その上に単一の ScriptManager を配置して、それで終了することを検討しましたか?

于 2009-03-16T15:38:49.020 に答える
0

私にとってうまくいったのは、 < form >の後にこの行を含めることでした

 <asp:ScriptManager ID="scriptManager" runat="server"/>

これにより、「...ページに ScriptManager が必要です。ScriptManager は、それを必要とするすべてのコントロールの前に表示する必要があります。」という問題を回避できました。

于 2012-05-15T15:14:25.660 に答える
0

私は機能する2つのものを作りました。

UserControl で、この Sub を作成します。

Public Sub SetFocus()
    txtBox.Focus()
End Sub

呼び出しサイトで、ScriptManagerCall の前にこれを呼び出します

userControl.SetFocus()

UserControl に AutoPostback がある場合は、TextChanged イベントにもフォーカスを設定する必要があります。

Protected Sub txtBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBox.TextChanged
    txtBox.Focus()
    ......
End Sub

これがうまくいくことを願っています。

于 2015-03-26T12:20:27.317 に答える
0

Init イベントが機能するはずだと思います。説明した手法を使用します(つまり、追加する前に ScriptManager.GetCurrent が null を返すことを確認します)が、ScriptManager を追加するときは、必ずフォーム内の最初のコントロールとして追加してください。

私はこれをテストしていませんが、うまくいくと思います。

于 2009-03-16T16:32:32.433 に答える