后一一天或两天拉我的头发我设法破解这...希望这可以帮助其他人像我一样沮丧:
任何人都发现这篇文章知道这里直观的答案,设置窗体的默认按钮到下一个butto你的向导n,什么都不做。因此,下一个合乎逻辑的步骤是通过代表用户单击按钮来设法解决问题。假设我从代码隐藏文件中附加以下处理程序,以我的文本框和myButtonId是按钮,我需要为我的默认的ID:
function textKeyDown(e) {
if (e.keyCode == 13) {
var myBtn = $get(myButtonId);
myBtn.click();
}
}
你会觉得上面会工作得很好,但因为它事实证明,强制向导按钮点击正在创建一个非常鬼祟的冲突 - 页面上的第一个按钮也会点击,覆盖最初的按钮点击我强制通过脚本创建非常奇怪的结果。就我而言,我的母版页中的第一个按钮是一个表示Home的按钮,当用户点击它时,他们会回到主页。所以在我试图强制Wizard的Next按钮点击时,我最终会回到我的主页,看起来没有任何理由。附加到PageRequestManager.initializeRequest后,我可以看到我有两个单独的回发启动: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事件中调用上述方法。还值得注意的是,因为我的向导每步只有一个文本框,所以我只需将此行为分配给单个控件即可。我还没有尝试过这个修复的范围,以在整个页面上捕捉到Enter键,尽管我无法想象它在这种情况下会表现得太不同。如果每步有很多输入,则可能不需要在向导中的每个控件上捕捉Enter键。
所以,你有它 - 只需要12个小时的故障排除来完成应该花费大约10分钟的时间。
快乐编码。
乙
我有这个问题。我试图根据你的答案来解决,但不能让它工作。 JavaScript已添加好,但页面仍然响应主页按钮,而不是下一个按钮....?有任何想法吗? – 2012-02-13 11:25:07
Hi @Mad Pierre - 您是否尝试过多种浏览器?我的答案可能会略微过时,因为Chrome浏览器已经决定“click()”不能被调用,而必须通过生成DOM2事件来模拟鼠标点击... – Brian 2012-02-15 12:10:13