2011-05-16 67 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; 
}