2014-11-12 2 views
2

У меня есть вид сетки в качестве UpdatePanel так:потерять фокус текстовых полей в GridView

<asp:UpdatePanel ID="UpdatePanel3" runat="server"> 
     <ContentTemplate> 
      <asp:Panel ID="pnl_lect" runat="server"> 
       <asp:GridView ID="gv_ques" runat="server" CssClass="formTable cr_center" AutoGenerateColumns="False" 
        ShowFooter="True" OnRowDataBound="gv_ques_RowDataBound"> 
        <Columns> 
         <asp:TemplateField HeaderText="عناصر التقييم"> 
          <ItemTemplate> 
           <asp:Label ID="lbl_ques" runat="server" Text='<%# Bind("que_desc") %>'></asp:Label> 

          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="Label1" runat="server" Text="الاجمالي"></asp:Label> 
          </FooterTemplate> 
          <ItemStyle Width="45%" /> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="ممتاز (4)"> 
          <ItemTemplate> 
           <telerik:RadNumericTextBox ID="txt_1" runat="server" DbValue='<%# Bind("grade_id1") %>' 
            AutoPostBack="true" Width="60px" MinValue="0" MaxValue="999999999" OnTextChanged="txt_1_TextChanged"> 
            <NumberFormat GroupSeparator="" DecimalDigits="0" /> 
           </telerik:RadNumericTextBox> 
           <asp:HiddenField ID="hf_1" runat="server" Value="1" /> 
          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="lbl_1" runat="server"></asp:Label> 
          </FooterTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="جيد جدًا (3)"> 
          <ItemTemplate> 
           <telerik:RadNumericTextBox ID="txt_2" runat="server" DbValue='<%# Bind("grade_id2") %>' 
            AutoPostBack="true" Width="60px" MinValue="0" MaxValue="999999999" OnTextChanged="txt_1_TextChanged"> 
            <NumberFormat GroupSeparator="" DecimalDigits="0" /> 
           </telerik:RadNumericTextBox> 
           <asp:HiddenField ID="hf_2" runat="server" Value="2" /> 
          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="lbl_2" runat="server"></asp:Label> 
          </FooterTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="جيد (2)"> 
          <ItemTemplate> 
           <telerik:RadNumericTextBox ID="txt_3" runat="server" DbValue='<%# Bind("grade_id3") %>' 
            AutoPostBack="true" Width="60px" MinValue="0" MaxValue="999999999" OnTextChanged="txt_1_TextChanged"> 
            <NumberFormat GroupSeparator="" DecimalDigits="0" /> 
           </telerik:RadNumericTextBox> 
           <asp:HiddenField ID="hf_3" runat="server" Value="3" /> 
          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="lbl_3" runat="server"></asp:Label> 
          </FooterTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="مقبول (1)"> 
          <ItemTemplate> 
           <telerik:RadNumericTextBox ID="txt_4" runat="server" DbValue='<%# Bind("grade_id4") %>' 
            AutoPostBack="true" Width="60px" MinValue="0" MaxValue="999999999" OnTextChanged="txt_1_TextChanged"> 
            <NumberFormat GroupSeparator="" DecimalDigits="0" /> 
           </telerik:RadNumericTextBox> 
           <asp:HiddenField ID="hf_4" runat="server" Value="4" /> 
          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="lbl_4" runat="server"></asp:Label> 
          </FooterTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="ضعيف (0)"> 
          <ItemTemplate> 
           <telerik:RadNumericTextBox ID="txt_5" runat="server" DbValue='<%# Bind("grade_id5") %>' 
            AutoPostBack="true" Width="60px" MinValue="0" MaxValue="999999999" OnTextChanged="txt_1_TextChanged"> 
            <NumberFormat GroupSeparator="" DecimalDigits="0" /> 
           </telerik:RadNumericTextBox> 
           <asp:HiddenField ID="hf_5" runat="server" Value="5" /> 
          </ItemTemplate> 
          <FooterTemplate> 
           <asp:Label ID="lbl_5" runat="server"></asp:Label> 
          </FooterTemplate> 
         </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 
      </asp:Panel> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

я теряю фокус с каждым постбэка так я пишу следующее:

protected void txt_1_TextChanged(object sender, EventArgs e) 
     { 
      int progSer = int.Parse(Session["prog_serial"].ToString()); 
      int total = 0; 
      RadNumericTextBox txt = (RadNumericTextBox)sender; 

      GridViewRow r = (GridViewRow)txt.NamingContainer; 

      TableCell cell = null; 

      Control parent = txt; 
      while ((parent = parent.Parent) != null && cell == null) 
       cell = parent as TableCell; 
      int indexOfTextBoxCell = -1; 
      if (cell != null) 
       indexOfTextBoxCell = r.Cells.GetCellIndex(cell); 


      foreach (GridViewRow row in gv_ques.Rows) 
      { 
       if (row.RowType == DataControlRowType.DataRow) 
       { 
        total = total + int.Parse(((RadNumericTextBox)row.Cells[indexOfTextBoxCell].Controls[1]).Value.ToString()); 
       } 
      } 
      ((Label)gv_ques.FooterRow.Cells[indexOfTextBoxCell].Controls[1]).Text = total.ToString(); 

      ScriptManager.RegisterStartupScript(this, this.GetType(), "selectAndFocus", "$get('" + txt.ClientID + "').focus();$get('" + txt.ClientID + "').select();", true);//the focus 
     } 

Теперь я выхожу из текстового поля, фокус все еще не совсем правильно установлен. Я должен занести вкладку один раз после обратной передачи для ее работы. Как настроить фокус на вкладке, а не на текущем текстовом поле?

ответ

0

Вы можете легко сосредоточиться на определенном элементе с помощью JavaScript:

window.onload = function() { 
    document.getElementById("txt_1").focus(); 
}; 

Или, если вы предпочитаете JQuery:

$(function() { 
    $("#txt_1").focus(); 
}); 

Этот код будет сосредоточено на элемент с идентификатором «txt_1» после того, как страница полностью загружен.

5

Одно решение, я предлагаю использовать javascript DOM Storage. Держите id фокусной текста input с local storage:

$(':text').on("focus", function(){ 
    localStorage.setItem("focusItem", this.id);//here set in localStorage id of the textbox 
    //console.log(localStorage.getItem("focusItem"));test the focus element id 
}); 

И $(document).ready(function(){}); случае вы можете установить фокус на входном текстовом поле:

$('#' + localStorage.getItem("focusItem")).focus(); 

Here also an live example. Сосредоточьтесь на тексте и после перезагрузки страницы.

Имейте в виду, что для удаления вещей в localStorage вам необходимо явно очистить их через localStorage.removeItem (itemName).

Конкретная информация here. Также full screen live example.

+0

спасибо так много '<язык = тип сценария "JavaScript"= "текст/JavaScript"> $ (': текст') на ("фокус", функция() {. localStorage.setItem ("focusItem", this.id); // здесь задается идентификатор localStorage идентификатора элемента textbox}}; $ (document) .ready (function() {$ ('#' + localStorage.getItem ("focusItem")). focus();}); 'но он не работает успешно. «autopostback = true» текстового поля, поэтому после того, как я перейду на вкладку «click», чтобы перейти к следующему блоку, он перейдет в первое текстовое поле в сетке! –

0

Похоже, что текстовое поле, на которое вы теряете фокус, запускает сообщение назад? Если это так, посмотрите на это, это не полное решение, но это начало. Это более или менее от верхней части моей головы, извините, если это не на 100% правильно. http://msdn.microsoft.com/en-us/library/vstudio/bb383810(v=vs.100).aspx

Sys.WebForms.PageRequestManager может получить идентификатор текстового поля или идентификатор элемента, который является обратной почтой. Оттуда вы можете использовать document.getElementById("itemID").focus();

var requestMgr = Sys.WebForms.PageRequestManager.getInstance(); 
requestMgr.add_endRequest(endRequestHandler); 

function endRequestHandler() { 
    var itemID = requestMgr.args.get_postBackElement().id 
    document.getElementById("itemID").focus() 
} 
Смежные вопросы