现在,这可能看起来重复,但事实并非如此。 互联网上的每个解决方案都会向您展示如何关注触发事件的文本框。
但是如果用户按下标签怎么办?应该具有焦点的文本框是下一个。 因此,我们进行了一种解决方法,并专注于TabIndex高于触发事件的文本框。
但是如果用户按下Shift +标签会怎么样? 更糟糕的是:如果用户点击另一个随机文本框会怎么样?
这就是问题所在。 我不认为这里需要代码,因为它是一个通用的解决方案,可以专注于具有autopostback功能的文本框。 如果需要代码,请在评论中提问。
答案 0 :(得分:2)
以下内容可让您按照自己的意愿行事:
我们需要做的是让js协助接下来的控制,在这种情况下,任何获得焦点的控件(无论是通过制表符,shift-tab,click,还是任何控件组合都会跳出文本盒子和不同的控制)。通过使用WebMethod,我们可以将此信息传递到服务器上以进行AutoPostBack焦点。
[WebMethod]
public static void set_nextFocus(string id)
{
_toFocus = id;
}
很简单,_toFocus是类变量static string _toFocus
,它保存下一个要聚焦的控件的值。
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
//sets focus to the proper control
Page.SetFocus(Page.FindControl(_toFocus));
}
}
<head>
中的
<script type="text/javascript">
function setFocus(x) {
PageMethods.set_nextFocus(x);
}
</script>
在这个例子中,一个TextBox。注意OnFocusIn的使用。它是ASP控件的expando属性,它将实现没有服务器端定义,并恢复为javascript的onfocusin属性。
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" TabIndex="1"
ontextchanged="TextBox1_TextChanged" OnFocusIn="setFocus(this.id)" >
</asp:TextBox>
此外,为了使用PageMethods,您必须在表单中启用它,如下所示:
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
答案 1 :(得分:0)
您可以检查表单的__EVENTTARGET
属性,该属性将告诉您从中引发事件的文本框名称。
方案,假设我有两个名为TextBox1
和TextBox2
的文本框,AutoPostBack
设置为true
并将textChanged
事件连接到单个处理程序TextBox1_TextChanged
。您可以拥有以下代码并将焦点设置回特定的文本框控件
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
string target = Request.Form["__EVENTTARGET"];
if (target == "Textbox2") //conrol name should be exact
{
Page.SetFocus(this.TextBox2);
}
}