2016-06-13 6 views
0

Ich habe ein Problem, bei dem ich das erste Mal mit meiner Gridview blättern kann, aber wenn ich versuche, auf die zweite Seite zu klicken, passiert nichts. Ich konnte feststellen, dass es mit einem JQuery-Skript zu tun hat, das verwendet wird, um zum nächsten Textfeld zu springen, nachdem ein OnTextChanged-Ereignis in meiner Gridview ausgelöst wurde, das wie ein Charm funktioniert. Als erstes ist hier der entsprechende Code:JQuery-Skript Verhindern, dass Gridview Paging mehr als einmal ausgelöst wird

<asp:ScriptManager ID="ScriptManagerDetails" runat="server" ScriptMode="Release"></asp:ScriptManager> 
     <script type="text/javascript"> 
      var g_CurrentTextBox;     
      Sys.Application.add_load(applicationLoadHandler); 
      function applicationLoadHandler() { 
       Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 
      } 

      function endRequestHandler() { 

       $get(g_CurrentTextBox).focus(); 
       $get(g_CurrentTextBox).select(); 
      } 


      function onTextFocus() { 
       g_CurrentTextBox = event.srcElement.id; 
      }     
     </script> 
     <asp:UpdatePanel ID="UpdatePanelDetails" runat="server"> 
      <ContentTemplate> 
      <div class="row" id="ItemResults"> 
      <asp:GridView ID="gvDetailList" runat="server" CssClass="table table-striped table-bordered table-hover" 
       AutoGenerateColumns="false" AllowPaging="true" OnPageIndexChanging="gvDetailList_PageIndexChanging" OnRowDataBound="gvDetailList_RowDataBound" Pagesize="25" > 
       <Columns> 
        <asp:BoundField DataField="ItemNumber" HeaderText ="Item Number" SortExpression="ItemNumber" /> 
        <asp:TemplateField HeaderText="Qty" SortExpression="QUANTITY"> 
         <ItemTemplate> 
          <asp:Label ID="lblGVQuantity" runat="server" Text='<%#Eval("QUANTITY") %>'></asp:Label> 
          <asp:Panel ID="pnlQuantity" runat="server"> 
           <asp:TextBox ID="txtQuantity" runat="server" class="form-control input-sm" 
             AutoPostBack="true" Text='<%#Eval("QUANTITY") %>' OnTextChanged="txtQuantity_TextChanged"></asp:TextBox> 
           <asp:CompareValidator ID="cvQuantity" runat="server" ControlToValidate="txtQuantity" Type="Integer" ForeColor="Red" 
           Operator="DataTypeCheck" ErrorMessage="Quantity is not numeric" Text="* Quantity is not numeric" Display="Dynamic" ValidationGroup="valAdd" /> 
          </asp:Panel> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
       <PagerStyle CssClass="pagination-ys" /> 
      </asp:GridView> 
      <asp:SqlDataSource ID="SqlDetailList" runat="server" 
      ConnectionString="<%$ ConnectionStrings:MyConnectionStr%>"      
      > 
     </asp:SqlDataSource> 
     </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

Hier ist der Code hinter:

protected void Page_Load(object sender, EventArgs e) 
{   
    if (!IsPostBack) 
    { 
     BindDetails(); 
    } 
} 

private void BindDetails() 
{   
    string strSQL = "SELECT * FROM TABLE"; 
    SqlDetailList.SelectCommand = strSQL; 
    gvDetailList.DataSource = SqlDetailList; 
    gvDetailList.DataBind(); 
} 

protected void gvDetailList_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{   
    gvDetailList.PageIndex = e.NewPageIndex; 
    BindDetails(); 
} 

Wenn ich das Skript zu entfernen, Paging funktioniert gut. Aber ich mag, sagte ich, mit dem Skript links, es funktioniert nur das erste Mal, aber nicht auf den folgenden Seiten.

+0

Gibt es eine Ausnahme JavaScript in der Konsole? –

+0

Ich glaube nicht. Ich sehe keine Fehler. – shiftingviews

+0

Habe ich alle ratlos? Haha. Aber bei allem Ernst wäre jede Hilfe dankbar. – shiftingviews

Antwort

0

Ok Ich denke, ich habe es jetzt funktioniert, nachdem ich einige Änderungen vorgenommen habe. Zuerst habe ich einige Änderungen am JQuery-Skript vorgenommen, indem ich untersucht habe, ob das aktuelle Textfeld null ist oder nicht und ob die Gridview-Anzahl die gleiche ist wie vor der Seitenanforderung. Das liegt daran, dass ich aus irgendeinem Grund, wenn ich in der fünften Zeile einer Seite bin und die nächste Seite nur vier Zeilen hat, den Fokus auf die fünfte Zeile der Seite legen würde und eine Ausnahme erhalten würde.

Dann für den Code hinter, ich habe einfach den Fokus auf die erste Zeile im Page_Load-Ereignis und PageIndexChanged-Ereignis (das ich hinzugefügt).

HTML:

<asp:ScriptManager ID="ScriptManagerDetails" runat="server" ScriptMode="Release"></asp:ScriptManager> 
    <script type="text/javascript"> 
     var rowscountbefore; 
     var g_CurrentTextBox;     
     Sys.Application.add_load(applicationLoadHandler); 
     function applicationLoadHandler() { 
      Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 
     } 

     function beginRequestHandler() { 
     rowscountbefore = $("#<%=gvDetailList.ClientID%> tr").length; 
     } 

     function endRequestHandler() { 
     if (g_CurrentTextBox != null && rowscountbefore == $("#<%=gvDetailList.ClientID%> tr").length) { 
      $get(g_CurrentTextBox).focus(); 
      $get(g_CurrentTextBox).select(); 
      } 
     } 

     function onTextFocus() { 
      g_CurrentTextBox = event.srcElement.id; 
     }     
    </script> 
    <asp:UpdatePanel ID="UpdatePanelDetails" runat="server"> 
     <ContentTemplate> 
     <div class="row" id="ItemResults"> 
     <asp:GridView ID="gvDetailList" runat="server" CssClass="table table-striped table-bordered table-hover" OnPageIndexChanged="gvDetailList_PageIndexChanged" 
      AutoGenerateColumns="false" AllowPaging="true" OnPageIndexChanging="gvDetailList_PageIndexChanging" OnRowDataBound="gvDetailList_RowDataBound" Pagesize="25" > 
      <Columns> 
       <asp:BoundField DataField="ItemNumber" HeaderText ="Item Number" SortExpression="ItemNumber" /> 
       <asp:TemplateField HeaderText="Qty" SortExpression="QUANTITY"> 
        <ItemTemplate> 
         <asp:Label ID="lblGVQuantity" runat="server" Text='<%#Eval("QUANTITY") %>'></asp:Label> 
         <asp:Panel ID="pnlQuantity" runat="server"> 
          <asp:TextBox ID="txtQuantity" runat="server" class="form-control input-sm" 
            AutoPostBack="true" Text='<%#Eval("QUANTITY") %>' OnTextChanged="txtQuantity_TextChanged"></asp:TextBox> 
          <asp:CompareValidator ID="cvQuantity" runat="server" ControlToValidate="txtQuantity" Type="Integer" ForeColor="Red" 
          Operator="DataTypeCheck" ErrorMessage="Quantity is not numeric" Text="* Quantity is not numeric" Display="Dynamic" ValidationGroup="valAdd" /> 
         </asp:Panel> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
      <PagerStyle CssClass="pagination-ys" /> 
     </asp:GridView> 
     <asp:SqlDataSource ID="SqlDetailList" runat="server" 
     ConnectionString="<%$ ConnectionStrings:MyConnectionStr%>"      
     > 
    </asp:SqlDataSource> 
    </div> 
    </ContentTemplate> 
</asp:UpdatePanel> 

-Code Behind:

protected void Page_Load(object sender, EventArgs e) 
{   
    if (!IsPostBack) 
    { 
     BindDetails(); 
     TextBox txtQuantity = (TextBox)gvDetailList.Rows[0].Cells[4].FindControl("txtQuantity"); 
     txtQuantity.Focus(); 
    } 
} 

private void BindDetails() 
{   
    string strSQL = "SELECT * FROM TABLE"; 
    SqlDetailList.SelectCommand = strSQL; 
    gvDetailList.DataSource = SqlDetailList; 
    gvDetailList.DataBind(); 
} 

protected void gvDetailList_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{   
    gvDetailList.PageIndex = e.NewPageIndex; 
    BindDetails(); 
} 

protected void gvDetailList_PageIndexChanged(object sender, EventArgs e) 
{ 
    TextBox txtQuantity = (TextBox)gvDetailList.Rows[0].Cells[4].FindControl("txtQuantity"); 
    txtQuantity.Focus(); 
} 
Verwandte Themen