0

これは、ポストバック後もページのタブ順序を維持する必要があるシナリオです。

3 つのテキスト ボックスを持つユーザー コントロールがあり、これは他のコントロールと共に aspx ページに配置されます。テスト ボックスの onBlur では、__doPostBack を実行してデータをサーバーに渡し、これを親ページで処理しています。このため、タブ オーダーが失われます。ポスト バックでタブ オーダーを維持することは可能ですか。親ページからコントロール内のテキスト ボックスにタブ移動し、次の親ページ コントロールに再びタブ移動します。

以下のコードを使用してユーザーコントロールの次のテキストボックスにフォーカスを設定しようとしましたが、ページをクリックするだけでユーザーがコントロールからフォーカスを外した場合でも、コードが呼び出されます。

 protected void Page_Load(object sender, EventArgs e)
    {
        if (this.IsPostBack)
        {
            WebControl wcICausedPostBack = (WebControl)GetControlThatCausedPostBack(sender as UserControl);
            if (wcICausedPostBack != null)
            {
                int indx = wcICausedPostBack.TabIndex;
                Panel selectedPanel = null;
                if (Panel1.Visible)
                {
                    selectedPanel = Panel1;
                }
                else if (Panel2.Visible)
                {
                    selectedPanel = Panel2;
                }
                if (selectedPanel != null)
                {

                    var ctrl = from control in selectedPanel.Controls.OfType<WebControl>()
                               where control.TabIndex == (indx + 1)
                               select control;
                    if (ctrl.Count() > 0)
                    {
                        ctrl.First().Focus();
                    }
                }
            }
        }
    }

    protected Control GetControlThatCausedPostBack(UserControl page)
    {
        Control control = null;
        string ctrlname = string.Empty;
        UserAction updateAction = CurrentUserAction();
        if (updateAction != null)
        {
            if (!string.IsNullOrEmpty(updateAction.Data))
            {
                string[] splitSting = updateAction.Data.Split('$');
                ctrlname = splitSting[splitSting.Count() - 1];
            }
        }
        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;
    }
4

1 に答える 1

1

jQueryを使用して、現在フォーカスされているフィールドIDを非表示のコントロールに保存できます。

非表示のコントロールに保存すると、ポストバック間で維持されます。
その入力IDを使用して次の入力を検索し、jQueryを使用して再度フォーカスを設定できます。

$("input").focus(function() {
    $("#currectFocusField").val($(this).attr("id"));
});

$(document).ready(function(){
    var lastFocusedInput = $("#currectFocusField").val();
});
于 2012-09-06T06:03:29.063 に答える