No. Ma puoi lavorarci con poco sforzo.
La questione che non mi convince è il primo TextBox che contiene una enorme mole di righe. E' questo che rallenta perchè ad ogni postback devi movimentare questi dati dal client al server e viceversa.
Io utilizzerei solo il secondo TextBox per fare vedere l'n-esima pagina, ma non il primo con tutti i dati.
Ti mando un esempio di paginazione di un vettore di dati. Vedi se può essere utile
codice:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="a.aspx.vb" Inherits="prove_a" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" Height="649px" TextMode="MultiLine" Width="206px"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" Height="649px" TextMode="MultiLine" Width="206px"></asp:TextBox>
Pagina: <asp:Label ID="Label1" runat="server" Text="" EnableViewState="false"></asp:Label>
<asp:LinkButton ID="link_primapagina" runat="server" ToolTip="prima pagina" ><<</asp:LinkButton>
<asp:LinkButton ID="link_indietro" runat="server" ToolTip="pagina precedente" ><</asp:LinkButton>
<asp:LinkButton ID="link_avanti" runat="server" ToolTip="pagina seguente" >></asp:LinkButton>
<asp:LinkButton ID="link_ultimapagina" runat="server" ToolTip="ultima pagina" >>></asp:LinkButton>
</div>
</form>
</body>
</html>
codice:
Option Strict On
Imports l = libreria.ModuloWeb
Partial Class prove_a
Inherits System.Web.UI.Page
Private RighePagina As Integer
Private NumeroRecord As Integer
Private Pagine As Integer
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim Pagina As Integer
'simulo il caricamento di NumeroRecord righe
NumeroRecord = 50000
If Not Me.IsPostBack Then
Dim sb As New StringBuilder()
For i As Integer = 1 To NumeroRecord
sb.AppendLine(i.ToString("0000"))
Next
'rimuovo l'ultimo salto-pagina
sb.Remove(sb.Length - 2, 2)
'a che serve riempire questo TextBox?
'Me.TextBox1.Text = sb.ToString
'mi ricavo il vettore di righe e lo conservo nella sessione
Dim vs As String() = sb.ToString().Split(New String() {vbNewLine}, StringSplitOptions.RemoveEmptyEntries)
Me.Session("vs") = vs
'la pagina corrente la conservo nel viewstate
Pagina = 1
Me.ViewState.Add("Pagina", Pagina)
Else
Pagina = CInt(Me.ViewState("Pagina"))
End If
'imposto il numero di righe per pagina
RighePagina = 40
'ricavo il numero di pagine totali
Pagine = CInt(Math.Ceiling(CDbl(NumeroRecord) / CDbl(RighePagina)))
If (Not Me.IsPostBack) Then Mostra(Pagina)
End Sub
Protected Sub Mostra(pagina As Integer)
'recupero il vettore dalla session
Dim vs As String() = CType(Me.Session("vs"), String())
'mi ricavo il puntatore inizio del vettore
Dim inizio As Integer = (pagina - 1) * RighePagina
'ricavo la lunghezza delle righe da unire (join)
Dim length As Integer = Math.Min(RighePagina, vs.Length - inizio)
If pagina = 1 Then
Me.link_avanti.Enabled = True
Me.link_ultimapagina.Enabled = True
Me.link_primapagina.Enabled = False
Me.link_indietro.Enabled = False
ElseIf pagina < Me.Pagine Then
Me.link_avanti.Enabled = True
Me.link_ultimapagina.Enabled = True
Me.link_primapagina.Enabled = True
Me.link_indietro.Enabled = True
ElseIf pagina = Me.Pagine Then
Me.link_avanti.Enabled = False
Me.link_ultimapagina.Enabled = False
Me.link_primapagina.Enabled = True
Me.link_indietro.Enabled = True
End If
Me.Label1.Text = pagina.ToString
'unisco le length righe del vettore vs partendo da inizio tramite il saltopagina
Me.TextBox2.Text = String.Join(vbCrLf, vs, inizio, length)
End Sub
Protected Sub link_primapagina_Click(sender As Object, e As EventArgs) Handles link_primapagina.Click
Mostra(1)
Me.ViewState("Pagina") = 1
End Sub
Protected Sub link_ultimapagina_Click(sender As Object, e As EventArgs) Handles link_ultimapagina.Click
Mostra(Me.Pagine)
Me.ViewState("Pagina") = Me.Pagine
End Sub
Protected Sub link_avanti_Click(sender As Object, e As EventArgs) Handles link_avanti.Click
Dim Pagina As Integer = CInt(Me.ViewState("Pagina"))
If Pagina < Me.Pagine Then
Pagina += 1
End If
Me.ViewState("Pagina") = Pagina
Mostra(Pagina)
End Sub
Protected Sub link_indietro_Click(sender As Object, e As EventArgs) Handles link_indietro.Click
Dim Pagina As Integer = CInt(Me.ViewState("Pagina"))
If Pagina > 1 Then
Pagina -= 1
End If
Me.ViewState("Pagina") = Pagina
Mostra(Pagina)
End Sub
End Class