设置焦点控件(转载)
设置焦点控件
转载于:http://msdn.microsoft.com/zh-cn/library/ms379557(VS.80).aspx
ASP.NET 2.0 提供了一个非常好的新功能,允许您指定首次显示页面时将哪个输入控件设置为焦点。这是一种灵活的功能,可以减少用户通过单击开始操作的负担,例如,在文本框中单击开始输入数据。
要将 HTML 组件指定为输入焦点,您需要一小段 Javascript 代码。首先声明一点:这不是尖端的火箭科学,您可以轻松地将这段 Javascript 代码作为内嵌代码添加到 <body> 标记的 onload 属性中。但是,在 Page 类上使用 SetFocus 方法确定服务器上的焦点控件的名称确实是前进了一大步。实际上,您可以在 ASP.NET 2.0 中使用以下代码。
void Page_Load(object sender, System.EventArgs e) {
SetFocus("TheFirstName");
}
当显示页面时,名为 TheFirstName 的输入控件将成为焦点。此方法便捷有效,但如何在 ASP.NET 1.x 中对其进行编码?
同样,实现此功能的技巧已为业界人士所熟知,也可以从 Google 中毫不费力地搜索到。但问题是,如何将其集成到基础 Page 类中以便重复使用。
让我们使用以下声明来扩展 Msdn.Page 基础类。
private string m_focusedControl;
public void SetFocus(string ctlId) {
m_focusedControl = ctlId;
}
SetFocus 方法收集控件的 ID 并将其存储在内部成员中。在页面的 PreRender 事件中,调用另一个帮助程序函数以构建和插入 Javascript 代码。
private void AddSetFocusScript()
{
if (m_focusedControl == "")
return;
// 添加脚本以声明函数
StringBuilder sb = new StringBuilder("");
sb.Append("<script language=javascript>");
sb.Append("function ");
sb.Append(SetFocusFunctionName);
sb.Append("(ctl) {");
sb.Append(" if (document.forms[0][ctl] != null)");
sb.Append(" {document.forms[0][ctl].focus();}");
sb.Append("}");
// 添加脚本以调用函数
sb.Append(SetFocusFunctionName);
sb.Append("('");
sb.Append(m_focusedControl);
sb.Append("');<");
sb.Append("/"); // 按照这种方式断开,以避免误解...
sb.Append("script>");
// 注册脚本(名称区分大小写)
if (!IsStartupScriptRegistered(SetFocusScriptName))
RegisterStartupScript(SetFocusScriptName, sb.ToString());
}
Javascript 代码可以像动态字符串一样构建,并累积存储在 StringBuilder 对象中。下一步是将该字符串添加到页面输出中。在 ASP.NET 中,要在页面中添加一些客户端脚本代码,必须先在特定页面级别的集合中注册该代码。为此,Page 类提供了几个 RegisterXxx 方法。每个 RegisterXxx 方法将 Javascript 代码块添加到不同的集合中,以便插入到最终页面标记中的不同位置。例如,RegisterStartupScript 在窗体的关闭标记之前插入代码。而 RegisterClientScriptBlock 在窗体的打开标记之后插入脚本代码。重要的是,必须在脚本中包括 <script> 元素的两个标记。每个脚本块都由一个关键字标识,这样多个服务器控件可以使用同一个脚本块,而不会将它发送给输出流两次或多次。
在页面中,以下 Javascript 代码块被插入到窗体的关闭标记之前。这样,它将在初始化后启动时立即开始运行。
<form>
:
<script language=javascript>
function __setFocus(ctl) {
if (document.forms[0][ctl] != null) {
document.forms[0][ctl].focus();
}
}
__setFocus('TheFirstName');
</script>
</form>
通过在 Msdn.Page 类上使用 SetFocus 公共方法,您可以在页面代码的任何位置决定在浏览器中显示页面时将哪个控件作为输入焦点。更重要的是,您可以根据运行时条件和/或回发事件作出此决定。