如何在回发后维护标签顺序

时间:2011-05-16 10:58:01

标签: c# asp.net

要求是在文本框中输入值时进行某些计算,并且由于计算相同,因此textchanged链接到同一事件。 当我选中它时,它会整齐地转到下一个控件,然后回发到Calculate。

现在在回发和服务器端被调用并执行之后,选项卡顺序混乱并且在选项卡上它没有将焦点带到正确的控件。它始终指向浏览器窗口中的URL。

请让我知道如何使用tabIndex检索回发后应该是下一个焦点的控件。

  <asp:TextBox ID="txtDiscount" runat="server" CssClass="NormalTextBox" TabIndex="45"
                                    MaxLength="3" OnTextChanged="btnCalculatePrice_Click" AutoPostBack="True"></asp:TextBox>


  protected void btnCalculatePrice_Click(object sender, EventArgs e)
    {....

}

我尝试了下面的代码,但不知道如何获取确切的控件

   if(sender!=null)
        {
            WebControl reqCtrl = (WebControl)sender;
            int taborder = reqCtrl.TabIndex;
            int nexttabOrder = taborder + 1;

        }

2 个答案:

答案 0 :(得分:6)

使用以下代码,以便在回发后将焦点设置为下一个控件。

protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
WebControl wcICausedPostBack = (WebControl)GetControlThatCausedPostBack(sender as Page);
int indx = wcICausedPostBack.TabIndex;
var ctrl = from control in wcICausedPostBack.Parent.Controls.OfType<WebControl>()
where control.TabIndex > indx
select control;
ctrl.DefaultIfEmpty(wcICausedPostBack).First().Focus();
}
}
protected Control GetControlThatCausedPostBack(Page page)
{
Control control = null;
string ctrlname = page.Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = page.FindControl(ctrlname);
}
else
{
foreach (string ctl in page.Request.Form)
{
Control c = page.FindControl(ctl);
if (c is System.Web.UI.WebControls.Button || c is System.Web.UI.WebControls.ImageButton)
{
control = c;
break;
}
}
}
return control;
}

答案 1 :(得分:0)

这是一个类似的(应用程序代码)解决方案,适用于可能不一定共享同一父级的控件。它假设标签索引恰好相差1个数字。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        SetFocusAfterPostBack();
    }
}

public static void SetFocusAfterPostBack()
{
    var page = HttpContext.Current.Handler as Page;
    if (page == null)
    {
        return;
    }
    var postBackCtl = page.FindControl(HttpContext.Current.Request.Form["__EVENTTARGET"]) as WebControl;
    if (postBackCtl == null || postBackCtl.TabIndex == 0)
    {
        return;
    }
    var ctl = GetCtlByTabIndex(page, postBackCtl.TabIndex + 1);
    if (ctl != null)
    {
        ctl.Focus();
    }
}
private static WebControl GetCtlByTabIndex(Control ParentCtl, int TabIndex)
{
    foreach (Control ctl in ParentCtl.Controls)
    {
        var webCtl = ctl as WebControl;
        if (webCtl != null)
        {
            if (webCtl.TabIndex == TabIndex)
            {
                return webCtl;
            }
        }
        var retCtl = GetCtlByTabIndex(ctl, TabIndex);
        if (retCtl != null)
        {
            return retCtl;
        }
    }
    return null;
}