2010-07-05 3 views
1

행 선택으로 포스트 백이 생성 된 후에 다시 gridview 행에 포커스를 놓을 수 있습니까?다시 게시 후 gridview의 선택된 행에 포커스 다시 넣기

탐색을 위해 키보드를 사용하기 위해 gridview 행에 onkeydown 처리기를 추가하려고합니다. 내 문제는 첫 번째 포스트 백 후에 선택한 셀이 포커스를 잃어 버리고 다음 키 스트로크가 셀에 걸리지 않는다는 것입니다.

나는 숨겨진 입력 필드에 셀의 ID를 복사 한 다음 코드

당신의 onKeyDown에 스크립트 코드에

protected void Page_Load(object sender, EventArgs e) 
    { 
     var persons = new List<Person> {new Person() {Name = "Fikre", Age = 24}, 
             new Person() {Name = "Mike", Age = 29}, 
             new Person() {Name = "Mark", Age = 35}}; 
     gdvPersons.DataSource = persons; 
     gdvPersons.DataBind(); 
    } 

    protected void gdvPersons_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
      e.Row.Attributes.Add("onkeydown", ClientScript.GetPostBackEventReference((Control)sender, "Select$" + e.Row.DataItemIndex)); 
    } 

    protected void gdvPersons_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     gdvPersons.SelectedRow.Focus(); 
    } 

답변

0

뒤에 그리드 뷰

<asp:GridView runat="server" ID="gdvPersons" AutoGenerateColumns="false" 
     onrowcreated="gdvPersons_RowCreated" onselectedindexchanged="gdvPersons_SelectedIndexChanged"> 
     <Columns> 
      <asp:TemplateField HeaderText="Name"> 
       <ItemTemplate> 
        <%# ((GridviewFocus.Person) Container.DataItem).Name %> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Age"> 
       <ItemTemplate> 
        <%# ((GridviewFocus.Person) Container.DataItem).Age %> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

강령을 가지고있다.

<input type="text" id="gridviewcell_id" onkeydown="lastcell.value = this.id" /> 
<input type="hidden" id="lastcell" runat="server" /> 

위 예제는 일반 html이며 적절한 onkeydown 코드를 gridview에 추가해야합니다.

포스트 백 (예 : onclick) 이벤트 처리기 코드에서 숨겨진 필드 값 속성에서 ID를 검색하고 페이지가 새로 고쳐지면 자바 스크립트를 등록하여 실행할 수 있습니다. 당신이 게시 당신이 뭔가를 할 수있는 수행을 클릭 버튼이있는 경우 :

protected void MyButton_Click(object sender, EventArgs e) 
{ 
    string id = lastcell.Value; 
    string script = "var ctrl = document.getElementById('" + lastcell.Value + "');"; 
    script += "ctrl.focus();"; 
    ClientScript.RegisterClientScriptBlock(this.GetType(), 
     "focusScript", script, true); 

} 

이것은로드 된 후에는 페이지가 다음 스크립트를 실행해야하고, 제어 초점 PIN이해야

var ctrl = document.getElementById("yourid"); 
ctrl.focus(); 
+0

귀하의 솔루션에가 있지만 im은 gridview의 행 ID에 문제가 있습니다. 질문에 내 원본 코드 포함 – Fikre

+0

게시 한 코드에 편집 필드가 없습니다. 그렇다면 네비게이션을 어떻게 할 계획입니까? 보다 완벽한 샘플을 제공하고 .net3.5 또는 4.0을 사용하고 있습니까? –

+0

gem의 onewydown 이벤트를 gdvPersons_RowCreated 이벤트의 각 행에 추가합니다. 내 코드의 문제점은 포커스가 가능하도록 테이블 행에 탭 인덱스가 필요하다는 것입니다. 또한 gdvPersons.SelectedRow.Focus()를 변경했습니다. 행에 초점을 맞추기위한 코드로, 답으로 표시했습니다. 감사 – Fikre