DataPagerField.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. //
  2. // System.Web.UI.WebControls.DataPagerField
  3. //
  4. // Authors:
  5. // Marek Habersack ([email protected])
  6. //
  7. // (C) 2007-2008 Novell, Inc
  8. //
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. #if NET_3_5
  30. using System;
  31. using System.Collections.Specialized;
  32. using System.ComponentModel;
  33. using System.Globalization;
  34. using System.Security.Permissions;
  35. using System.Text;
  36. using System.Web;
  37. using System.Web.UI;
  38. namespace System.Web.UI.WebControls
  39. {
  40. [AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  41. [AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  42. public abstract class DataPagerField : IStateManager
  43. {
  44. static readonly object FieldChangedEvent = new object ();
  45. EventHandlerList events;
  46. StateBag _state = new StateBag ();
  47. DataPager _dataPager;
  48. bool _queryStringHandled;
  49. bool _isTrackingViewState;
  50. string _queryStringNavigateUrl;
  51. internal event EventHandler FieldChanged {
  52. add { AddEventHandler (FieldChangedEvent, value); }
  53. remove { RemoveEventHandler (FieldChangedEvent, value); }
  54. }
  55. protected DataPagerField ()
  56. {
  57. }
  58. protected internal DataPagerField CloneField ()
  59. {
  60. DataPagerField ret = CreateField ();
  61. CopyProperties (ret);
  62. return ret;
  63. }
  64. protected virtual void CopyProperties (DataPagerField newField)
  65. {
  66. // assuming we should copy only the public properties
  67. newField.Visible = Visible;
  68. }
  69. public abstract void CreateDataPagers (DataPagerFieldItem container, int startRowIndex, int maximumRows,
  70. int totalRowCount, int fieldIndex);
  71. protected abstract DataPagerField CreateField ();
  72. protected string GetQueryStringNavigateUrl (int pageNumber)
  73. {
  74. if (_queryStringNavigateUrl == null && _dataPager != null) {
  75. HttpContext ctx = HttpContext.Current;
  76. HttpRequest req = ctx != null ? ctx.Request : null;
  77. string queryFieldName = _dataPager.QueryStringField;
  78. if (req != null) {
  79. StringBuilder sb = new StringBuilder (req.Path + "?");
  80. NameValueCollection coll = req.QueryString;
  81. foreach (string k in coll.AllKeys) {
  82. if (String.Compare (k, queryFieldName, StringComparison.OrdinalIgnoreCase) == 0)
  83. continue;
  84. sb.Append (HttpUtility.UrlEncode (k) + "=" + HttpUtility.UrlEncode (coll [k]) + "&");
  85. }
  86. sb.Append (queryFieldName + "=");
  87. _queryStringNavigateUrl = sb.ToString ();
  88. } else
  89. _queryStringNavigateUrl = String.Empty;
  90. }
  91. return _queryStringNavigateUrl + pageNumber.ToString (CultureInfo.InvariantCulture);
  92. }
  93. public abstract void HandleEvent (CommandEventArgs e);
  94. protected virtual void LoadViewState (Object savedState)
  95. {
  96. if (savedState == null)
  97. return;
  98. ((IStateManager) ViewState).LoadViewState (savedState);
  99. }
  100. protected virtual void OnFieldChanged ()
  101. {
  102. InvokeEvent (FieldChangedEvent, EventArgs.Empty);
  103. }
  104. protected virtual object SaveViewState ()
  105. {
  106. return ((IStateManager) ViewState).SaveViewState ();
  107. }
  108. protected virtual void TrackViewState ()
  109. {
  110. _isTrackingViewState = true;
  111. ((IStateManager)ViewState).TrackViewState ();
  112. }
  113. protected DataPager DataPager {
  114. get { return _dataPager; }
  115. }
  116. protected bool QueryStringHandled {
  117. get { return _queryStringHandled; }
  118. set { _queryStringHandled = value; }
  119. }
  120. protected string QueryStringValue {
  121. get {
  122. if (_dataPager == null)
  123. return String.Empty;
  124. HttpContext ctx = HttpContext.Current;
  125. HttpRequest req = ctx != null ? ctx.Request : null;
  126. if (req == null)
  127. return String.Empty;
  128. return req.QueryString [_dataPager.QueryStringField];
  129. }
  130. }
  131. protected StateBag ViewState {
  132. get { return _state; }
  133. }
  134. public bool Visible {
  135. get {
  136. object o = ViewState ["Visible"];
  137. if (o == null)
  138. return true;
  139. return (bool) o;
  140. }
  141. set {
  142. if (value != Visible) {
  143. ViewState ["Visible"] = value;
  144. OnFieldChanged ();
  145. }
  146. }
  147. }
  148. protected bool IsTrackingViewState {
  149. get { return _isTrackingViewState; }
  150. }
  151. void IStateManager.TrackViewState ()
  152. {
  153. TrackViewState ();
  154. }
  155. bool IStateManager.IsTrackingViewState {
  156. get { return IsTrackingViewState; }
  157. }
  158. object IStateManager.SaveViewState ()
  159. {
  160. return SaveViewState ();
  161. }
  162. void IStateManager.LoadViewState (object state)
  163. {
  164. LoadViewState (state);
  165. }
  166. internal void SetDataPager (DataPager pager)
  167. {
  168. _dataPager = pager;
  169. }
  170. internal bool GetQueryModeStartRowIndex (int totalRowCount, int maximumRows, ref int startRowIndex, ref bool setPagePropertiesNeeded)
  171. {
  172. bool queryMode = !String.IsNullOrEmpty (DataPager.QueryStringField);
  173. if (!queryMode || QueryStringHandled)
  174. return false;
  175. QueryStringHandled = true;
  176. // We need to calculate the new start index since it is probably out
  177. // of date because the GET parameter with the page number hasn't
  178. // been processed yet
  179. int pageNumber;
  180. try {
  181. pageNumber = Int32.Parse (QueryStringValue);
  182. } catch {
  183. // ignore
  184. pageNumber = -1;
  185. }
  186. if (pageNumber >= 0) {
  187. pageNumber--; // we're zero-based since we're calculating
  188. // the offset/index
  189. if (pageNumber >= 0) {
  190. // zero-based calculation again
  191. int pageCount = (totalRowCount - 1) / maximumRows;
  192. if (pageNumber <= pageCount) {
  193. startRowIndex = pageNumber * maximumRows;
  194. setPagePropertiesNeeded = true;
  195. }
  196. }
  197. }
  198. return true;
  199. }
  200. void AddEventHandler (object key, EventHandler handler)
  201. {
  202. if (events == null)
  203. events = new EventHandlerList ();
  204. events.AddHandler (key, handler);
  205. }
  206. void RemoveEventHandler (object key, EventHandler handler)
  207. {
  208. if (events == null)
  209. return;
  210. events.RemoveHandler (key, handler);
  211. }
  212. void InvokeEvent (object key, EventArgs args)
  213. {
  214. if (events == null)
  215. return;
  216. EventHandler eh = events [key] as EventHandler;
  217. if (eh == null)
  218. return;
  219. eh (this, args);
  220. }
  221. }
  222. }
  223. #endif