我有三个文本框、一个下拉列表框、一个复选框和两个链接按钮,它们都在一个表格中。由于服务器端需要进行一些计算(通过OnTextChanged调用),所以文本框和下拉列表框必须执行自动回发。
我的问题在于,在任何控件的内容(需要回发)更改后,当您尝试将焦点移动到页面上的其他控件时(无论是通过制表符还是使用鼠标单击其他控件),焦点不会移动到下一个控件或您单击的控件。
我尝试了一种方法,它可以找到当前控件,并基于TabIndex添加1,从而将焦点移动到下一个控件。但问题在于,它不允许将焦点设置在任何其他控件上,除了具有下一个TabIndex的控件。为了更好地解释这里是一个情况的例子。
例如:我有TextBox1、TextBox2和TextBox3。我更改了TextBox2中的内容,然后想向后移动到TextBox1。当我单击TextBox1时,焦点被设置为TextBox3,因为代码使用的是TabIndex的顺序。 **这里的一个关键因素是,在服务器端代码触发之前,TextBox1确实获得了焦点,但随后失去了焦点并将其设置为TextBox3**
对我来说,似乎唯一的方法是在客户端添加一个函数,在PostBack发生之前找到具有焦点的控件,然后在服务器端代码完成后重新设置该控件的焦点。当这种情况发生时,似乎我在服务器端所做的任何事情都不起作用,因为焦点已经丢失。
我已经进行了大量搜索,但没有能够找到解决此特定问题的任何解决方案,我找到的所有内容都涉及将焦点设置为下一个控件,而不是您想要获得焦点的控件。任何帮助将不胜感激。谢谢。
这是我用于基于TabIndex移动到下一个控件的代码,但在我的情况下不起作用。
protected void Page_Load(object sender, EventArgs e)
{
WebControl ctrl = GetPostBackControl() as WebControl;
if (ctrl != null && !SetNextFocus(Controls, ctrl.TabIndex + 1)) { ctrl.Focus(); }
}
public Control GetPostBackControl()
{
Control control = null;
string ctrlname = Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = FindControl(ctrlname);
control.Focus();
}
else
{
foreach (string ctl in Request.Form)
{
Control c = FindControl(ctl);
if (c is Button)
{
control = c;
break;
}
}
}
return control;
}
private bool SetNextFocus(ControlCollection controls, int tabIndex)
{
foreach (Control control in controls)
{
if (control.HasControls())
{
bool found = SetNextFocus(control.Controls, tabIndex);
if (found) { return true; }
}
WebControl webControl = control as WebControl;
if (webControl == null) { continue; }
if (webControl.TabIndex != tabIndex) { continue; }
webControl.Focus();
return true;
}
return false;
}