2

ASP.NET Web フォームにウィザード コントロールがあります。次のように、コード ビハインドで ApplicationWizard PreRender イベントの各ステップにデフォルト ボタンを設定しています。

Page.Form.DefaultButton = ApplicationWizard.FindControl("StepNavigationTemplateContainerID").FindControl("StepNextButton").UniqueID;

これは完全に機能していますが、Wizard コントロールを ajax 化すると機能しません。デフォルト ボタンは、最初にフォームを読み込むときに指定したコントロール (StartNextButton) に設定されますが、他のステップでは StepNextButton に更新されません。私は何を間違っていますか?

4

6 に答える 6

1

Brian さんに感謝します。あなたのスクリプトは、RadAjax と複数のユーザー コントロールと複数の種類のパネルを使用するときに、自分のスクリプトをセットアップするのに役立ちました。スクリプトではなくコントロールからボタン ID を渡すことで、defaultButton を簡略化できます。

ページ内:

function defaultButton(btnid, src, evt) {
    if (evt.keyCode == 13) {
        var btn = $get(btnid);
        setTimeout(new function () { btn.click(); }, 5);
    }
}

コード内:

Private Sub WizardStep_PreRender(sender As Object, e As System.EventArgs) Handles wsUserPass.PreRender, wsCompanyCode.PreRender, wsSetPassword.PreRender
    Dim button As WebControl = Nothing
    Dim activeWizardStep As WizardStepBase = CType(sender, WizardStepBase)
    Select Case activeWizardStep.StepType
        Case WizardStepType.Step
            button = activeWizardStep.FindControl("StepNavigationTemplateContainerID").FindControl("StepNextButton")
        Case WizardStepType.Start
            button = activeWizardStep.FindControl("StartNavigationTemplateContainerID").FindControl("StartNextButton")
        Case WizardStepType.Finish
            button = activeWizardStep.FindControl("FinishNavigationTemplateContainerID").FindControl("FinishButton")
    End Select
    If button Is Nothing Then Return
    Dim ctrls = FindControls(Of RadTextBox)(activeWizardStep)
    For Each ctrl In ctrls
        ctrl.Attributes.Add("onkeydown", String.Format("defaultButton('{0}', this, event);", button.ClientID))
    Next
    pnlMain.DefaultButton = button.UniqueID
End Sub

Public Shared Function FindControls(Of T)(ctrl As Control) As List(Of T)
    Dim controls As New List(Of T)
    If ctrl.Controls.Count > 0 Then
        For Each subctrl In ctrl.Controls
            If [Type].ReferenceEquals(GetType(T), subctrl.GetType()) Then
                controls.Add(subctrl)
            Else
                controls.AddRange(FindControls(Of T)(subctrl))
            End If
        Next
    End If
    Return controls
End Function

(注、UniqueID は機能しませんでした。ClientID に変更する必要がありました)

于 2011-09-22T21:38:24.213 に答える
1

1日か2日髪を抜いた後、私はなんとかこれを解読しました...これが私と同じように他の人がイライラするのを助けることを願っています:

この投稿を見つけた人なら誰でも、フォームのデフォルト ボタンをウィザードの [次へ] ボタンに設定する直感的な答えが何もしないことを知っています。したがって、次の論理的なステップは、ユーザーに代わってボタンをクリックすることで、問題を回避するように設計することです。コードビハインド内から以下のハンドラーをテキストボックスにアタッチし、myButtonId がデフォルトとして必要なボタンの ID であると仮定します。

            function textKeyDown(e) {
                if (e.keyCode == 13) {
                    var myBtn = $get(myButtonId);
                    myBtn.click();
                }
            }

上記は問題なく動作すると思うかもしれませんが、実際には、ウィザード ボタンをクリックすることを強制すると、非常に卑劣な競合が発生しました。非常に奇妙な結果を生み出しています。私の場合、マスター ページの最初のボタンは [ホーム] というボタンで、ユーザーがそれをクリックすると、ホーム ページに戻ります。そのため、ウィザードの [次へ] ボタンを強制的にクリックさせようとすると、まったく理由がないように見えて、すぐに自分のホームページに戻ってしまいます。PageRequestManager.initializeRequest にアタッチした後、2 つの別々のポストバックが開始されていることがわかりました。1 つはウィザード ボタンの強制クリック用、もう 1 つはその時点ではレーダーにさえなかったボタン (ホームページ ボタン) 用です。

つまり、コード ビハインド内からフォームのデフォルト ボタン (Page.Form.DefaultButton) を更新し、コード ビハインド内からこのスクリプトを発行して、テキスト ボックスからも参照すると、すべて正常に動作します。

    public static void ExampleAssignDefaultButton(WizardStepBase activeWizardStep, TextBox myTextBox, IButtonControl myButton)
    {
        // create the format string for the script
        string javaScript = @"function defaultButton(src, evt){{
                                if(evt.keyCode == 13){{
                                    var btn = $get('{0}');
                                    setTimeout(new function() {{ btn.click(); }}, 5);
                                }}
                            }}";

        // format it ...
        javaScript = String.Format(javaScript, ((WebControl)myButton).ClientID);
        // register it...
        ScriptManager.RegisterClientScriptBlock(activeWizardStep, activeWizardStep.GetType(), "defaultButton", javaScript, true);

        // assign it to my textbox
        myTextBox.Attributes.Add("onkeydown", "defaultButton(this, event);");

        // also update the form's default button:
        myTextBox.Page.Form.DefaultButton = ((WebControl)myButton).UniqueID;
    }

上記のメソッドは常に、アクティブなウィザード ステップの OnPreRender イベントから呼び出すことに注意してください。また、ウィザードのステップごとに 1 つのテキスト ボックスしかないため、この動作を 1 つのコントロールに割り当てるだけで済みました。ページ全体で Enter キーの押下をキャッチする範囲でこの修正を試みたことはありませんが、そのコンテキストで動作が大きく異なるとは想像できません。ステップごとに多くの入力がある場合は、ウィザード内の各コントロールで Enter キーを押す必要はないでしょう。

これで、約 10 分かかるはずのトラブルシューティングが、わずか 12 時間で済みました。

ハッピーコーディング。

B

于 2011-07-20T13:05:11.270 に答える
0

デフォルトボタンの定義は何ですか? テキスト フォーム フィールド (input type=text) で Enter キーを押したときに呼び出されるボタンの場合、すべてのブラウザーで、フォームの最初の送信ボタンまたは画像ボタン (input type=submit|image) になります。存在する場合。

あなたができることは、クライアントスクリプトをすべてのコントロールに追加することです。これには、[入力] でフォームを送信するなどのルールが適用されます (input type="text" のように)。

アイデアのためだけにサーバー側のサンプル (Form_Init で使用できます):

SomeTextBox.Attributes.Add("onkeydown",
    "if((event.keyCode&&event.keyCode==13)){" +
    Page.ClientScript.GetPostBackEventReference(StepNextButton, "") +
    ";return false;}" +
    "if((event.keyCode&&event.keyCode==27)){" +
    Page.ClientScript.GetPostBackEventReference(CancelButton, "") +
    ";return false;}");

keyCode==13 は Enter キー
です keyCode==27 は Escape キーです

于 2009-08-06T14:31:31.820 に答える
0

ここでスクリプトを作成する必要はないと思います。問題は、ページに複数の送信ボタンがあることです。したがって、「デフォルト」の送信として使用するものをasp.netに伝える必要があります。そして、ページのライフサイクルの適切なタイミングでそれを伝える必要があります。最適かどうかはわかりませんが、PreRender イベントで実行するとうまくいくようです。次のコードのみが追加された基本的な ajax 化されたウィザードは、適切なボタンを使用しているようです。

Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
    MyBase.OnPreRender(e)
    Select Case LoginWizard.ActiveStep.StepType
        Case WizardStepType.Start
            Page.Form.DefaultButton = LoginWizard.FindControl("StartNavigationTemplateContainerID").FindControl("NextStart").UniqueID
        Case WizardStepType.Step
            Page.Form.DefaultButton = LoginWizard.FindControl("StepNavigationTemplateContainerID").FindControl("NextStep").UniqueID
        Case WizardStepType.Finish
            Page.Form.DefaultButton = LoginWizard.FindControl("FinishNavigationTemplateContainerID").FindControl("LastStep").UniqueID
    End Select
End Sub
于 2012-06-05T18:05:43.897 に答える
0

私はついにこれをクラックしたと思います!JavaScriptの(デバッグ)アラートメッセージが機能したという事実は、私を正しい方向に向けました...

メソッドが次のようになるように、javascript に数行追加して動作させる必要がありました。

private void SetDefaultButtonScript(WizardStepBase activeWizardStep, IButtonControl myButton)
    {
        string clientID = ((WebControl)myButton).ClientID;
        string uniqueID = ((WebControl)myButton).UniqueID;

        // create the format string for the script 
        string javaScript = @"function defaultButton(btnid, evt) {{ 
                                if (evt.keyCode == 13) {{ 
                                    __doPostBack('{0}', '');
                                    var btn = $get('{1}');
                                    btn.focus();
                                    return;
                                }} 
                            }} 
                            ";
        javaScript = String.Format(javaScript, uniqueID, clientID); 

        // register it... 
        ScriptManager.RegisterClientScriptBlock(activeWizardStep, activeWizardStep.GetType(), "defaultButton", javaScript, true);

        foreach (Control c in activeWizardStep.Controls)
        {
            if (c is TextBox)
            {
                ((TextBox)c).Attributes.Add("onkeydown", "defaultButton(this, event);"); 
            }
            //TODO child controls of controls to find all text boxes, any other controls etc
        }

        Page.Form.DefaultButton = uniqueID;
    } 

私もクリックの代わりに __doPostBack を使用していますが、それは問題ではありませんでした。

于 2012-02-10T10:31:28.827 に答える
0

ScriptManager.SetFocusを試してください。

于 2009-08-03T14:37:45.303 に答える