Через день или два, когда я выдергивал волосы, мне удалось взломать это ... надеюсь, это поможет другим, таким же разочарованным, как и я:
Любой, кто нашел этот пост, знает, что интуитивно понятный ответ здесь, установка кнопки формы по умолчанию на кнопку «Далее» вашего мастера, ничего не делает. Итак, следующий логический шаг — попытаться обойти проблему, нажав кнопку от имени пользователя. Предположим, я прикрепил приведенный ниже обработчик к моему текстовому полю из кода программной части и что myButtonId — это идентификатор кнопки, которая мне нужна по умолчанию:
function textKeyDown(e) {
if (e.keyCode == 13) {
var myBtn = $get(myButtonId);
myBtn.click();
}
}
Вы могли бы подумать, что описанное выше будет работать просто отлично, но, как оказалось, принуждение кнопки Wizard к нажатию создавало чрезвычайно скрытый конфликт — первая кнопка на странице также нажималась, переопределяя первоначальный щелчок кнопки, который я принудительно нажал с помощью скрипта и создавая очень странные результаты. В моем случае первая кнопка на главной странице — это кнопка с надписью «Домой», и когда пользователь нажимает ее, он возвращается на свою домашнюю страницу. Таким образом, в моих попытках заставить кнопку Мастера «Далее» щелкнуть, я возвращался обратно на свою домашнюю страницу, что казалось безо всякой причины. После присоединения к 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 минут.
Удачного кодирования.
B
person
Brian
schedule
20.07.2011