Mercurial > pub > bltoolkit
comparison Demo/Asp.Net/Web/App_Code/CustomGrid.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin | 
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:f990fcb411a9 | 
|---|---|
| 1 using System; | |
| 2 using System.Collections; | |
| 3 using System.Text.RegularExpressions; | |
| 4 using System.Web.UI; | |
| 5 using System.Web.UI.WebControls; | |
| 6 | |
| 7 namespace PetShop.Web | |
| 8 { | |
| 9 public class CustomGrid : Repeater | |
| 10 { | |
| 11 private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled); | |
| 12 | |
| 13 protected string _emptyText; | |
| 14 private IList _dataSource; | |
| 15 private int _pageSize = 10; | |
| 16 private int _currentPageIndex; | |
| 17 private int _itemCount; | |
| 18 | |
| 19 public override object DataSource | |
| 20 { | |
| 21 set | |
| 22 { | |
| 23 // This try catch block is to avoid issues with the VS.NET designer | |
| 24 // The designer will try and bind a datasource which does not derive from ILIST | |
| 25 try | |
| 26 { | |
| 27 _dataSource = (IList)value; | |
| 28 ItemCount = _dataSource.Count; | |
| 29 } | |
| 30 catch | |
| 31 { | |
| 32 _dataSource = null; | |
| 33 ItemCount = 0; | |
| 34 } | |
| 35 } | |
| 36 } | |
| 37 | |
| 38 public int PageSize { get { return _pageSize; } set { _pageSize = value; } } | |
| 39 protected virtual int ItemCount { get { return _itemCount; } set { _itemCount = value; } } | |
| 40 public virtual int CurrentPageIndex { get { return _currentPageIndex; } set { _currentPageIndex = value; } } | |
| 41 | |
| 42 protected int PageCount { get { return (ItemCount - 1) / _pageSize; } } | |
| 43 public string EmptyText { set { _emptyText = value; } } | |
| 44 | |
| 45 public void SetPage(int index) | |
| 46 { | |
| 47 OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index)); | |
| 48 } | |
| 49 | |
| 50 protected override void OnLoad(EventArgs e) | |
| 51 { | |
| 52 if (Visible) | |
| 53 { | |
| 54 string page = Context.Request["page"]; | |
| 55 int index = page != null ? int.Parse(page) : 0; | |
| 56 | |
| 57 SetPage(index); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 /// <summary> | |
| 62 /// Overridden method to control how the page is rendered | |
| 63 /// </summary> | |
| 64 /// <param name="writer"></param> | |
| 65 protected override void Render(HtmlTextWriter writer) | |
| 66 { | |
| 67 // Check there is some data attached | |
| 68 // | |
| 69 if (ItemCount == 0) | |
| 70 { | |
| 71 writer.Write(_emptyText); | |
| 72 return; | |
| 73 } | |
| 74 | |
| 75 // Mask the query | |
| 76 // | |
| 77 string query = Context.Request.Url.Query.Replace("?", "&"); | |
| 78 query = RX.Replace(query, string.Empty); | |
| 79 | |
| 80 // Write out the first part of the control, the table header | |
| 81 // | |
| 82 writer.Write("<table cellpadding=0 cellspacing=0><tr><td colspan=2>"); | |
| 83 | |
| 84 // Call the inherited method | |
| 85 // | |
| 86 base.Render(writer); | |
| 87 | |
| 88 // Write out a table row closure | |
| 89 // | |
| 90 writer.Write("</td></tr><tr><td class=paging align=left>"); | |
| 91 | |
| 92 // Determin whether next and previous buttons are required Previous button? | |
| 93 // | |
| 94 if (_currentPageIndex > 0) | |
| 95 writer.Write(string.Format("<a href=?page={0}>< Previous</a>", _currentPageIndex - 1 + query)); | |
| 96 | |
| 97 // Close the table data tag | |
| 98 // | |
| 99 writer.Write("</td><td align=right class=paging>"); | |
| 100 | |
| 101 // Next button? | |
| 102 // | |
| 103 if (_currentPageIndex < PageCount) | |
| 104 writer.Write(string.Format("<a href=?page={0}>More ></a>", _currentPageIndex + 1 + query)); | |
| 105 | |
| 106 // Close the table | |
| 107 // | |
| 108 writer.Write("</td></tr></table>"); | |
| 109 } | |
| 110 | |
| 111 protected override void OnDataBinding(EventArgs e) | |
| 112 { | |
| 113 // Work out which items we want to render to the page | |
| 114 // | |
| 115 int start = CurrentPageIndex * _pageSize; | |
| 116 int size = Math.Min(_pageSize, ItemCount - start); | |
| 117 | |
| 118 IList page = new ArrayList(); | |
| 119 | |
| 120 // Add the relevant items from the datasource | |
| 121 // | |
| 122 for (int i = 0; i < size; i++) | |
| 123 page.Add(_dataSource[start + i]); | |
| 124 | |
| 125 // Set the base objects datasource | |
| 126 // | |
| 127 base.DataSource = page; | |
| 128 base.OnDataBinding(e); | |
| 129 } | |
| 130 | |
| 131 public event DataGridPageChangedEventHandler PageIndexChanged; | |
| 132 | |
| 133 protected virtual void OnPageIndexChanged(DataGridPageChangedEventArgs e) | |
| 134 { | |
| 135 if (PageIndexChanged != null) | |
| 136 PageIndexChanged(this, e); | |
| 137 } | |
| 138 } | |
| 139 } | 
