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