2011-08-08 24 views
5

Tôi đã đặt hộp văn bản trong chế độ xem lưới và tôi sử dụng phương thức Focus() để khôi phục tiêu điểm sau khi mất hộp văn bản dự định. Vấn đề là:Cách ngăn phương thức Focus() di chuyển trang lên đầu trang

Trang (có thể cuộn) và khi tôi gọi phương pháp Focus, trong sự kiện thay đổi văn bản, trang nhảy lên trên cùng. Đó là một hành vi khó hiểu.

Câu hỏi của tôi là:

Có một số cách để ngăn chặn các phương pháp Focus() từ nhảy trang đến đỉnh cao?

Mã của tôi:

protected void txt_evaluateWeights_TextChanged(object sender, EventArgs e) 
     { 

      calc(); 
      int index = ((System.Web.UI.WebControls.GridViewRow)(((RadTextBox)sender).Parent.NamingContainer)).DataItemIndex; 

      ((RadTextBox)gv_Evaluation.Rows[index + 1].Cells[3].FindControl("txt_evaluateWeights")).Focus();//Here is the problem. 
     } 

Lưu ý:

  • tôi sử dụng asp:TextBox, và cùng một vấn đề.

  • xem lưới của tôi trong một bảng cập nhật


EDIT:

Javascript workaround:

var lastFocusedControlId = ""; 

function focusHandler(e) { 
    document.activeElement = e.originalTarget; 
} 

function appInit() { 
    if (typeof (window.addEventListener) !== "undefined") { 
     window.addEventListener("focus", focusHandler, true); 
    } 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoadingHandler); 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler); 
} 

function pageLoadingHandler(sender, args) { 
    lastFocusedControlId = typeof (document.activeElement) === "undefined" 
     ? "" : document.activeElement.id; 
} 

function focusControl(targetControl) { 
    if (Sys.Browser.agent === Sys.Browser.InternetExplorer) { 
     var focusTarget = targetControl; 
     if (focusTarget && (typeof (focusTarget.contentEditable) !== "undefined")) { 
      oldContentEditableSetting = focusTarget.contentEditable; 
      focusTarget.contentEditable = false; 
     } 
     else { 
      focusTarget = null; 
     } 
     try { 
      targetControl.focus(); 
      if (focusTarget) { 
       focusTarget.contentEditable = oldContentEditableSetting; 
      } 
     } 
     catch (err) { } 
    } 
    else { 
     targetControl.focus(); 
    } 

} 

function pageLoadedHandler(sender, args) { 
    if (typeof (lastFocusedControlId) !== "undefined" && lastFocusedControlId != "") { 
     var newFocused = $get(lastFocusedControlId); 
     if (newFocused) { 
      focusControl(newFocused); 
     } 
    } 
} 

Sys.Application.add_init(appInit); 

Trả lời

3

Thay vì cố gắng khắc phục cách thức hoạt động của Phương thức tập trung, có một giải pháp thay thế. Tôi đã không thử nó, nhưng this page has a discussion of the problem, và một số javascript phía máy khách để nhớ điều khiển nào đã tập trung, và sau đó đặt tiêu điểm trở lại đối tượng đó sau khi UpdatePanel được làm mới. Hãy chắc chắn đọc nhận xét về một số cập nhật cho tập lệnh.

Nếu bạn sử dụng phương pháp này, bạn sẽ xóa cuộc gọi để Tập trung vào mã nguồn của mình và để tập lệnh này xử lý nó trên máy khách.

+0

Cảm ơn chúng tôi rất nhiều vì giải pháp tuyệt vời này. Tôi chỉnh sửa câu hỏi của tôi, Bạn có đề xuất bất kỳ cải tiến nào cho mã này không? –

+1

Tôi không thể thấy bất kỳ vấn đề nào với nó vào lúc này (chưa thực sự sử dụng nó). Vì vậy, nếu nó hoạt động tốt cho bạn trong các trình duyệt khác nhau, sau đó tôi muốn để nó một mình. – patmortech

+0

nhưng những gì '===' có nghĩa là trong javascript? –

1

Bạn có thể cố gắng sử dụng maintainScrollPositionOnPostBac k tùy chọn:

<%@ Page MaintainScrollPositionOnPostback="true" %> 
+0

GridView của tôi là trong một updatepanel –

+0

không postback ...... –

1

Bạn có thể sử dụng this jQuery plugin để di chuyển đến hộp của bạn:

$(...).scrollTo($('<%= txt_evaluateWeights.ClientID %>')) 
+0

Làm thế nào để sử dụng dòng này trong asp.net.I'm của tôi không tốt trong 'jquery'. –

1

Bạn có thể thử này sau khi bạn cài đặt tập trung

Response.Write("<script type='text/javascript'>$(...).scollTo($('<%= txt_evaluateWeights.ClientID %>')) 
</script>"); 
1

Câu hỏi này đã được hỏi một zilliontimes.

Đó là một lỗi trong thư viện JS ASP.NET và các cách giải quyết là hacky:

var oldScroll = window.scrollTo; 
window.scrollTo = function(){}; 

//... the ugly ASP.NET stuff 

window.scrollTo = oldScroll; 

Các giải pháp dứt khoát vấn đề này là để ngăn chặn việc sử dụng Microsoft ASP.NET và bắt đầu sử dụng một công nghệ cho phép đàng hoàng bạn để viết kịch bản phía máy khách.

+0

hmmm, Do u xem xét asp.net không phải là một công nghệ phong nha ?? !! –

+0

Nó chắc chắn không đáng giá tiền. =) – thwd

+0

nhưng những gì tôi biết là 'SOF' được xây dựng với công nghệ này. –

2

Miễn là bạn đang sử dụng bảng cập nhật và jquery, giải pháp khá đơn giản. Giả sử ID hộp văn bản của bạn là tbDeliveryCost. Thay vì sử dụng tbDeliveryCost.Focus(), làm điều này:

string script = string.Format("$('#{0}').focus();", tbDeliveryCost.ClientID); 
ScriptManager.RegisterStartupScript(this, this.GetType(), "SetFocus", script, true); 
Các vấn đề liên quan