2010-05-30 13 views
0

J'ai une DataList montrant les résultats, et un Répéteur qui est supposé être le pager. J'ai décidé d'utiliser le numéro de page en le redirigeant avec un paramètre QueryString, donc il sera également signable ... Mon problème se situe principalement dans l'interface utilisateur.Implémentation d'un pager pour le DataList/Repeater d'asp.net

Si je mets les DIV avec leur onclick appelant une fonction JS qui fait window.location = url + pagenumber, alors je dois faire face à des opérations QueryString via JS qui est un peu désordonné. Si j'utilise des objets LinkButton dans le ItemTemplate, la redirection se produit uniquement lorsque le bouton link est cliqué alors que div entier a le curseur: pointeur, vous savez ce que je veux dire.

Quelle serait la meilleure approche à ce sujet? Merci d'avance.

Note: Je veux vraiment passer le temps et l'effort à mettre en œuvre ma propre pagination côté serveur. Je pense que c'est plus amusant que de lire des manuels de tiers.

Répondre

0

Markup:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SoruListe.ascx.cs" Inherits="SoruListe" %> 
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> 
<%@ Register src="EtiketControl.ascx" tagname="EtiketControl" tagprefix="uc1" %> 
<script type="text/javascript"> 
    $(document).ready(function() { 
    if ($('.pageritem')) { 
      $('#pageritem-' + get_pagenumber()).addClass("pagerselected"); 
     } 
    }); 

    function soruyuac(id) { 
     var url = "SoruDetay.aspx?sid=" + id; 
     window.location = url; 
    } 

    function get_QueryString(fieldname) { 
     var qstr = window.location.search.substring(1); 
     var pairs = qstr.split('&'); 
     for (i = 0; i < pairs.length; i++) { 
      var keyval = pairs[i].split('='); 
      if (keyval[0] && keyval[0] == fieldname) { 
       return keyval[1]; 
      } 
     } 
    } 

    function set_QueryString(fieldname, value) { 
     var rawurl = window.location.href; 
     if (rawurl.indexOf('?') > -1) { rawurl = window.location.href.split('?')[0]; } 
     var qstr = window.location.search.substring(1); 
     var pairs = qstr.split('&'); 
     var foundit = false; 

     for (i = 0; i < pairs.length; i++) { 
      if (i == 0 && rawurl.indexOf('?') == -1) { rawurl += '?' }; ///Buraya kadar saglam görünüyo 

      var curpair = pairs[i].split('='); 
      if (curpair[0] == fieldname) { /// paramname'i al ama deger için yeni geleni koy 
       foundit = true; 
       rawurl += curpair[0] + '=' + value; 
       if (i != pairs.length - 1) { rawurl += '&' } 
      } 
      else { ///aynen geri doldur 
       rawurl += curpair[0] + '=' + curpair[1]; 
       if (i != pairs.length - 1) { rawurl += '&' } 
      } 
     } 
     if (!foundit) { rawurl += '&' + fieldname + '=' + value; } 
     /// 
     return rawurl; 
    } 

    function changepage(pagenum) { 
     window.location = set_QueryString('pg', pagenum); 
    } 

    function get_pagenumber() { 
     var pgn = get_QueryString('pg'); 
     if (pgn == null) return 1; 
     return pgn; 
    } 

    function skipfrom(from) { 
     window.location = set_QueryString('skip', from); 
    } 
</script> 

<div id="dvPager"> 
    <asp:Repeater ID="pagerSorular" runat="server"> 
    <ItemTemplate> 
     <div class="pageritem pagertext" id='<%# "pageritem-" + Container.DataItem %>' 
      onclick='<%# (Container.DataItem != "...")?("changepage(" + Container.DataItem + ");"): ("skipfrom(" + (this.PageNumber + 4) + ");") %>' > 
      <%# Container.DataItem %> 
     </div> 
    </ItemTemplate> 
    </asp:Repeater> 
</div> 

<asp:DataList ID="gridSorular" runat="server" Width="100%" OnItemDataBound="gridSorular_ItemDataBound"> 
    <ItemTemplate> 
     <div class="soruwrapper"> 
      <asp:HiddenField ID="hfSoruID" runat="server" Value='<%# Eval("ID") %>' /> 
      <div class="viewsbox boxtext"> 
       <b class="boxtext"><%# Eval("VIEWS") %></b> 
       <br />Okuyan 
       <hr /> 
       <div class='<%# "answersbox boxtext " + ((int.Parse(Eval("ANSWERS").ToString()) > 0) ? "isanswered" : "notanswered") %>'> 
        <b class="numtext"><%# Eval("ANSWERS")%></b> 
        <br />Cevap 
       </div> 
      </div> 

      <div class="item" onclick='<%# "soruyuac(" + Eval("ID") + ");" %>'> 
       <div class="soruheader" title='<%# Server.HtmlEncode(Eval("BODY").ToString())%>' > 
        <%# Eval("TITLE") %> 
       </div> 
       <div class="etiketwrapper"> 
        <uc1:EtiketControl ID="EtiketControl1" runat="server" /> 
       </div> 
      </div> 
     </div> 
    </ItemTemplate> 
</asp:DataList> 

côté serveur:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using DataLayer; 

public partial class SoruListe : System.Web.UI.UserControl 
{ 
    public int PageNumber 
    { 
     get 
     { 
      string strPgNum = Request.QueryString["pg"] as String; 
      if (!String.IsNullOrEmpty(strPgNum)) 
      { 
       int pgnum; 
       if (int.TryParse(strPgNum, out pgnum)) 
       { 
        if (pgnum <= 0) 
        { 
         return pgnum; 
        } 
        else 
        { 
         return 1; 
        } 
       } 
       else 
       { 
        return 1; 
       } 
      } 
      else 
      { 
       return 1; 
      } 
     } 
    } 
    public int PageSize { get { return 1; } } 
    public string PageName { 
     get 
     { 
      string url = Request.Url.ToString(); 
      string[] parts = url.Split(new char[]{'/'}); 
      return parts[parts.Length - 1]; 
     } 
    } 

    public void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public void SonSorular() 
    { 
     gridSorular.DataSource = BLL.SonSorular(300,300); 
     gridSorular.DataBind(); 
     /// 
    } 

    protected void CreatePager() 
    { 
     int pagenumber = this.PageNumber; 
     int start = 1; 
     if (PageNumber > 3) 
     { 
      start = pagenumber - 3; 
     } 
     int finish = pagenumber + 3; 
     int sorucount; 
     using (DataAccessDataContext db = new DataAccessDataContext()) 
     { 
      sorucount = db.Sorus.Count(); 
     } 

     List<string> pageritemlist = new List<string>(); 

     int c = start; 
     for (int i = 0; i < finish; i++) 
     { 
      pageritemlist.Add((c++).ToString()); 
     } 
     pageritemlist.Add("..."); 
     pageritemlist.Add(sorucount.ToString()); 

     pagerSorular.DataSource = pageritemlist.ToArray(); 
     pagerSorular.DataBind(); 
    } 

    public void ListAll() 
    { 
     CreatePager(); 
     int pagesize = this.PageSize; 
     int skip = this.PageNumber * pagesize; 
     ListSorular(skip, pagesize); 
    } 
    public void Popular() 
    { 

    } 
    public void Active() 
    { 

    } 
    public void Unanswered() 
    { 

    } 
    public void ListSorular(int skip, int take) 
    { 
     using (DataAccessDataContext db = new DataAccessDataContext()) 
     { 
      List<SoruGridView> sorular = (from s in db.Sorus 
              select new SoruGridView() { 
              ID = s.ID, TITLE = s.TITLE, BODY = s.BODY, TARIH = s.DATECREATED, VIEWS = s.VIEWS, ANSWERS = s.Cevaps.Count 
              }).Skip(skip).Take(take).ToList(); 
      gridSorular.DataSource = sorular; 
      gridSorular.DataBind(); 
     } 
    } 

    protected void gridSorular_ItemDataBound(object sender, DataListItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      HiddenField hfsoruid = e.Item.FindControl("hfSoruID") as HiddenField; 
      if (hfsoruid != null) 
      { 
       int sid; 
       if (int.TryParse(hfsoruid.Value, out sid)) 
       { 
        EtiketControl tagsctrl = (EtiketControl)e.Item.FindControl("EtiketControl1"); 
        tagsctrl.GetTags(sid); 
       } 
      } 
     } 
    } 
} 

Il y a aussi mon analyseur querystring JavaScript écrit par moi :)