我有一个表单视图,旨在在每次更改 text_changed 事件或下拉列表时更新其数据源。在每个 text_changed 事件和其他控件的等效事件上,我调用 formView.UpdateItem 方法,这会导致表单从我已经向下切换到的控件失去焦点。
我尝试实现此方法,但在第二次尝试选择控件后出现未知的运行时错误。
我不禁想到还有另一种方法可以解决这个问题。
你将如何解决这个问题?
我有一个表单视图,旨在在每次更改 text_changed 事件或下拉列表时更新其数据源。在每个 text_changed 事件和其他控件的等效事件上,我调用 formView.UpdateItem 方法,这会导致表单从我已经向下切换到的控件失去焦点。
我尝试实现此方法,但在第二次尝试选择控件后出现未知的运行时错误。
我不禁想到还有另一种方法可以解决这个问题。
你将如何解决这个问题?
对于这样的事情,我经常使用 javascript 将值存储在 asp:Hidden 控件 (input type="hidden") 中,然后添加一个 pageLoad 函数(在 javascript 中)来解析该字段,然后设置焦点。这样,焦点控件的 id 通过回发保持不变。
像这样的东西(伪代码):
<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();
}
您也可以在服务器端执行此操作。下面是一个如何将焦点放在导致异步回发的控件上的示例:
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;
}