2009-05-12 2 views
2

У меня есть формуляр, который предназначен для обновления его источника данных каждый раз, когда изменилось событие или раскрывающийся список text_changed. В каждом событии text_changed и эквиваленте для других элементов управления я вызываю метод formView.UpdateItem, и это приводит к тому, что форма теряет фокус из элемента управления, с которым я привязывался.Сохранение фокуса на панели обновления ajax после обновления формы

Я попытался реализовать this method, но я получил неизвестные ошибки времени выполнения после того, как попытался выбрать элемент управления во второй раз.

Я не могу не думать, что есть другой способ справиться с этим.

Как вы решили решить эту проблему?

ответ

1

Для таких вещей я часто фиксирую значение в asp: Скрытый элемент управления (тип ввода = «скрытый») с помощью javascript, а затем добавляю функцию pageLoad (в javascript) для разбора этого поля, а затем устанавливаем фокус. Таким образом, идентификатор сфокусированного управления сохраняется через обратную передачу.

Что-то вроде этого (псевдокод):

<input type="hidden" id="focusHolder" /> 

function onSubmit (registered via ClientScript.RegisterOnSubmitStatemnet) { 
grab the target and stash id in #focusHolder 
} 

function pageLoad() { 
$get($get('focusHolder').value).focus(); 
} 
+0

Можете ли вы дать подробный и точный код? Я слабый в javascript. –

0

Вы можете сделать это на стороне сервера тоже. Вот пример того, как сосредоточиться на контроле, который вызвал асинхронную обратную передачу:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) 
      { 
       string IDPostbackCtrl = GetAsyncPostBackControlID(Page, Page.Request); 
       ScriptManager.GetCurrent(Page).SetFocus(IDPostbackCtrl); 
      } 
     } 
    } 

    public string GetAsyncPostBackControlID(Page page, HttpRequest request) 
    { 
     string smUniqueId = ScriptManager.GetCurrent(page).UniqueID; 
     string smFieldValue = request.Form[smUniqueId]; 

     if (!String.IsNullOrEmpty(smFieldValue) && smFieldValue.Contains('|')) 
      return smFieldValue.Split('|')[1]; 

     return String.Empty; 
    }