2013-10-04 18 views
10

Ho un gridview guidato dal database con il paging abilitato. Tutto funziona bene, ed è rilegata come segue su Page Load:Navigazione nelle pagine di GridView dai valori di url

sqldataadapter da = new saldatadapter("sql query"), con); 
datatable dt = new datatable(); 
gridview1.datasource = dt; 
gridview1.databind(); 

C'è un'opzione che posso consentire al numero di pagina appare automaticamente l'url? La ragione per cui voglio farlo è che posso inviare l'url tramite il numero di pagina, quindi quando l'utente fa clic sull'URL, la griglia visualizza i dati dalla pagina corretta.

UPDATE 2 - codice completo attuale, come richiesto:

public partial class conflict_search_Default : System.Web.UI.Page 
{ 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 

      if (Request.QueryString["page"] != null) 
      { 

       int index = int.Parse(Request.QueryString["page"]); 
       GridView1.PageIndex = index; 
       BindData(); 


      } 
      else 
      { 

       BindData(); 

      } 

     } 
     else 
     { 

      BindData(); 

     } 
    } 

    private void BindData() 
    { 
     SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["connString"]); 
     SqlDataAdapter da = new SqlDataAdapter("sql query here which returns over 100 pages", con); 

     DataTable dt = new DataTable(); 
     da.Fill(dt); 

     GridView1.DataSource = dt; 

     GridView1.DataBind(); 
    } 

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     int index = e.NewPageIndex + 1; 
     string url = HttpContext.Current.Request.Url.AbsoluteUri; 
     e.Cancel = true; 

     Response.Redirect(string.Format("{0}?page={1}", url, index)); 
    } 

    protected void GridView1_PageIndexChanged(object sender, EventArgs e) 
    { 
     BindData(); 
    } 
} 

Questo mi dà un errore quando prova a cliccare sui numeri di paging sul fondo del datagrid. L'errore è il seguente:

Se carico la pagina fresca, verrà caricata. Se faccio quindi clic sulla pagina numero 5, visualizza ?page=5 nell'url che è quello che mi aspetto, ma per qualche motivo, la pagina 6 è selezionata sui numeri di impaginazione nella parte inferiore dello schermo. Se poi clicco pagina 10, ad esempio, l'URL cambia a ?page=5?page=10 che è chiaramente sbagliato, che dà l'errore:

Input string was not in a correct format. 
int index = int.Parse(Request.QueryString["page"]); 

risposta

2

Se si modifica il codice in funzione di GridView1_PageIndexChanging come di seguito tutto quello che potrebbe funzionare:

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    e.Cancel = true; 
    int index = e.NewPageIndex; 
    string urlPath = HttpContext.Current.Request.Url.AbsoluteUri; 
    Uri uri = new Uri(urlPath); 
    string url = uri.GetLeftPart(UriPartial.Path); 
    Response.Redirect(string.Format("{0}?page={1}", url, index)); 
} 

Inoltre non avete bisogno di handel GridView1_PageIndexChanged evento.

7

Usa:

protected void GridView1_PageIndexChanging(Object sender, GridViewPageEventArgs e) 
{ 
    int index = e.NewPageIndex + 1; 
    string url = HttpContext.Current.Request.Url.AbsoluteUri; 
    e.Cancel; 

    Response.Redirect(string.Format("{0}?page={1}", url, index)); 
} 

PageLoad(...) 
{ 
    if (!Page.IsPostBack) 
    { 
      if (Request.QueryString["page"] != null) 
      { 
       int index = int.Parse(Request.QueryString["page"]); 
       // bind your gridview 
      GridView1.PageIndex = index; 
      } 
    } 
} 

da GridView Paging and Sorting with url parameters

+0

'e.Cancel' mi dà l'errore' CS0201: solo assegnazione, chiamata, incremento, decrementi e nuove espressioni oggetto possono essere utilizzate come istruzioni'. – oshirowanen

+0

@oshirowanen e.Cancel = true; – MikroDel

+0

@oshirowanen ma non e.Cancel() = true; no **() ** – MikroDel

2

quando si modifica la Indice della pagina per la griglia, è necessario Rebind o impostare l'indice della pagina prima di rilegare:

 if (!string.IsNullOrEmpty(Request.QueryString["page"]) && int.Parse(Request.QueryString["page"]) < GridView1.PageCount) 
     { 
      GridView1.PageIndex = int.Parse(Request.QueryString["page"]); 
      GridView1.DataBind(); 
     } 
2

Prova questo, impostare pageIndex prima BindData()

if (!Page.IsPostBack) 
     { 

      if (Request.QueryString["page"] != null) 
      { 

       int index = int.Parse(Request.QueryString["page"]); 
       GridView1.PageIndex = index; 
       BindData(); 


      } 
      else 
      { 

       BindData(); 

      } 

     } 
2

Perché si sta chiamando BindData() su GridView1_PageIndexChanged

e durante il debug l'eccezione, che cosa esattamente si ottiene come un valore per Request.QueryString["page"]

Forse Ho sbagliato, ma ha alcun valore?