2011-05-16 54 views
4

要求是在输入文本框中的值时进行一些计算,并且由于计算结果相同,ontextchanged链接到相同的事件。 当我列出它整齐地去下一个控制并做回发计算。如何在回发后维护制表顺序

现在在回发和服务器端被调用并执行后,Tab键顺序就会混乱起来,并且在选项卡上它不会将焦点集中到正确的控件上。它始终指向浏览器窗口中的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; 

     } 
+0

使用.Focus()到下一个控制http://msdn.microsoft.com/en-us/library/ms178232.aspx – 2011-05-16 11:03:57

+0

的btnCalculatePrice从3个不同的文本框被称为,例如TextBox1中,TextBox2中,textbox3。现在,当我在textbox1中时,我的下一个焦点是textbox2,但是当我在textbox2中时,我的下一个焦点在textbox3中。我需要一个通用的方法来决定下一个焦点,并根据tabindex或clientid调用.focus。我想我接近答案。 – 2011-05-16 11:06:50

+0

TextBox txt =((TextBox)(sender)); – 2011-05-16 11:10:11

回答

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; 
} 
+0

感谢它工作得很好。 – 2011-05-16 11:16:27

+0

伟大的解决方案,工作得很好。 – 2012-11-12 15:40:22

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; 
}