ListView.cs 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058
  1. //
  2. // System.Web.UI.WebControls.ListView
  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;
  32. using System.Collections.Generic;
  33. using System.Collections.Specialized;
  34. using System.ComponentModel;
  35. using System.Drawing;
  36. using System.Web;
  37. using System.Web.UI;
  38. using System.Web.UI.HtmlControls;
  39. namespace System.Web.UI.WebControls
  40. {
  41. [DefaultEvent ("SelectedIndexChanged")]
  42. [DefaultProperty ("SelectedValue")]
  43. [SupportsEventValidation]
  44. [ControlValueProperty ("SelectedValue")]
  45. [ToolboxBitmap (typeof (System.Web.UI.WebControls.ListView), "ListView.ico")]
  46. [ToolboxItemFilter ("System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", ToolboxItemFilterType.Require)]
  47. [Designer ("System.Web.UI.Design.WebControls.ListViewDesigner, System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
  48. public class ListView : DataBoundControl, INamingContainer, IPageableItemContainer
  49. {
  50. const int CSTATE_BASE_STATE = 0;
  51. const int CSTATE_DATAKEYNAMES = 1;
  52. const int CSTATE_DATAKEYSSTATE = 2;
  53. const int CSTATE_GROUPITEMCOUNT = 3;
  54. const int CSTATE_TOTALROWCOUNT = 4;
  55. const int CSTATE_EDITINDEX = 5;
  56. const int CSTATE_SELECTEDINDEX = 6;
  57. const int CSTATE_SORTDIRECTION = 7;
  58. const int CSTATE_SORTEXPRESSION = 8;
  59. const int CSTATE_COUNT = 9;
  60. delegate void GroupStart ();
  61. ITemplate _emptyDataTemplate;
  62. ITemplate _emptyItemTemplate;
  63. ITemplate _insertItemTemplate;
  64. ITemplate _groupSeparatorTemplate;
  65. ITemplate _groupTemplate;
  66. ITemplate _itemSeparatorTemplate;
  67. ITemplate _itemTemplate;
  68. ITemplate _selectedItemTemplate;
  69. ITemplate _alternatingItemTemplate;
  70. ITemplate _editItemTemplate;
  71. ITemplate _layoutTemplate;
  72. int _totalRowCount;
  73. int _startRowIndex = -1;
  74. int _maximumRows = -1;
  75. int _selectedIndex;
  76. int _editIndex;
  77. int _groupItemCount;
  78. List <ListViewDataItem> _items;
  79. string [] _dataKeyNames;
  80. DataKeyArray _dataKeys;
  81. ArrayList _dataKeyArray;
  82. SortDirection _sortDirection = SortDirection.Ascending;
  83. string _sortExpression = String.Empty;
  84. Control _layoutTemplatePlaceholder;
  85. Control _nonGroupedItemsContainer;
  86. Control _groupedItemsContainer;
  87. int _nonGroupedItemsContainerFirstItemIndex = -1;
  88. int _groupedItemsContainerPlaceholderIndex = -1;
  89. int _nonGroupedItemsContainerItemCount;
  90. int _groupedItemsContainerItemCount;
  91. IOrderedDictionary _lastInsertValues;
  92. IOrderedDictionary _currentEditOldValues;
  93. IOrderedDictionary _currentEditNewValues;
  94. IOrderedDictionary _currentDeletingItemKeys;
  95. IOrderedDictionary _currentDeletingItemValues;
  96. int _firstIdAfterLayoutTemplate = 0;
  97. #region Events
  98. // Event keys
  99. static readonly object ItemCancellingEvent = new object ();
  100. static readonly object ItemCommandEvent = new object ();
  101. static readonly object ItemCreatedEvent = new object ();
  102. static readonly object ItemDataBoundEvent = new object ();
  103. static readonly object ItemDeletedEvent = new object ();
  104. static readonly object ItemDeletingEvent = new object ();
  105. static readonly object ItemEditingEvent = new object ();
  106. static readonly object ItemInsertedEvent = new object ();
  107. static readonly object ItemInsertingEvent = new object ();
  108. static readonly object ItemUpdatedEvent = new object ();
  109. static readonly object ItemUpdatingEvent = new object ();
  110. static readonly object LayoutCreatedEvent = new object ();
  111. static readonly object PagePropertiesChangedEvent = new object ();
  112. static readonly object PagePropertiesChangingEvent = new object ();
  113. static readonly object SelectedIndexChangedEvent = new object ();
  114. static readonly object SelectedIndexChangingEvent = new object ();
  115. static readonly object SortedEvent = new object ();
  116. static readonly object SortingEvent = new object ();
  117. static readonly object TotalRowCountAvailableEvent = new object ();
  118. [Category ("Action")]
  119. public event EventHandler <ListViewCancelEventArgs> ItemCanceling {
  120. add { Events.AddHandler (ItemCancellingEvent, value); }
  121. remove { Events.RemoveHandler (ItemCancellingEvent, value); }
  122. }
  123. [Category ("Action")]
  124. public event EventHandler <ListViewCommandEventArgs> ItemCommand {
  125. add { Events.AddHandler (ItemCommandEvent, value); }
  126. remove { Events.RemoveHandler (ItemCommandEvent, value); }
  127. }
  128. [Category ("Behavior")]
  129. public event EventHandler <ListViewItemEventArgs> ItemCreated {
  130. add { Events.AddHandler (ItemCreatedEvent, value); }
  131. remove { Events.RemoveHandler (ItemCreatedEvent, value); }
  132. }
  133. [Category ("Data")]
  134. public event EventHandler <ListViewItemEventArgs> ItemDataBound {
  135. add { Events.AddHandler (ItemDataBoundEvent, value); }
  136. remove { Events.RemoveHandler (ItemDataBoundEvent, value); }
  137. }
  138. [Category ("Action")]
  139. public event EventHandler <ListViewDeletedEventArgs> ItemDeleted {
  140. add { Events.AddHandler (ItemDeletedEvent, value); }
  141. remove { Events.RemoveHandler (ItemDeletedEvent, value); }
  142. }
  143. [Category ("Action")]
  144. public event EventHandler <ListViewDeleteEventArgs> ItemDeleting {
  145. add { Events.AddHandler (ItemDeletingEvent, value); }
  146. remove { Events.RemoveHandler (ItemDeletingEvent, value); }
  147. }
  148. [Category ("Action")]
  149. public event EventHandler <ListViewEditEventArgs> ItemEditing {
  150. add { Events.AddHandler (ItemEditingEvent, value); }
  151. remove { Events.RemoveHandler (ItemEditingEvent, value); }
  152. }
  153. [Category ("Action")]
  154. public event EventHandler <ListViewInsertedEventArgs> ItemInserted {
  155. add { Events.AddHandler (ItemInsertedEvent, value); }
  156. remove { Events.RemoveHandler (ItemInsertedEvent, value); }
  157. }
  158. [Category ("Action")]
  159. public event EventHandler <ListViewInsertEventArgs> ItemInserting {
  160. add { Events.AddHandler (ItemInsertingEvent, value); }
  161. remove { Events.RemoveHandler (ItemInsertingEvent, value); }
  162. }
  163. [Category ("Action")]
  164. public event EventHandler <ListViewUpdatedEventArgs> ItemUpdated {
  165. add { Events.AddHandler (ItemUpdatedEvent, value); }
  166. remove { Events.RemoveHandler (ItemUpdatedEvent, value); }
  167. }
  168. [Category ("Action")]
  169. public event EventHandler <ListViewUpdateEventArgs> ItemUpdating {
  170. add { Events.AddHandler (ItemUpdatingEvent, value); }
  171. remove { Events.RemoveHandler (ItemUpdatingEvent, value); }
  172. }
  173. [Category ("Behavior")]
  174. public event EventHandler LayoutCreated {
  175. add { Events.AddHandler (LayoutCreatedEvent, value); }
  176. remove { Events.RemoveHandler (LayoutCreatedEvent, value); }
  177. }
  178. [Category ("Behavior")]
  179. public event EventHandler PagePropertiesChanged {
  180. add { Events.AddHandler (PagePropertiesChangedEvent, value); }
  181. remove { Events.RemoveHandler (PagePropertiesChangedEvent, value); }
  182. }
  183. [Category ("Behavior")]
  184. public event EventHandler <PagePropertiesChangingEventArgs> PagePropertiesChanging {
  185. add { Events.AddHandler (PagePropertiesChangingEvent, value); }
  186. remove { Events.RemoveHandler (PagePropertiesChangingEvent, value); }
  187. }
  188. [Category ("Action")]
  189. public event EventHandler SelectedIndexChanged {
  190. add { Events.AddHandler (SelectedIndexChangedEvent, value); }
  191. remove { Events.RemoveHandler (SelectedIndexChangedEvent, value); }
  192. }
  193. [Category ("Action")]
  194. public event EventHandler <ListViewSelectEventArgs> SelectedIndexChanging {
  195. add { Events.AddHandler (SelectedIndexChangingEvent, value); }
  196. remove { Events.RemoveHandler (SelectedIndexChangingEvent, value); }
  197. }
  198. [Category ("Action")]
  199. public event EventHandler Sorted {
  200. add { Events.AddHandler (SortedEvent, value); }
  201. remove { Events.RemoveHandler (SortedEvent, value); }
  202. }
  203. [Category ("Action")]
  204. public event EventHandler <ListViewSortEventArgs> Sorting {
  205. add { Events.AddHandler (SortingEvent, value); }
  206. remove { Events.RemoveHandler (SortingEvent, value); }
  207. }
  208. event EventHandler <PageEventArgs> IPageableItemContainer.TotalRowCountAvailable {
  209. add { Events.AddHandler (TotalRowCountAvailableEvent, value); }
  210. remove { Events.RemoveHandler (TotalRowCountAvailableEvent, value); }
  211. }
  212. #endregion
  213. #region Properties
  214. IOrderedDictionary CurrentEditOldValues {
  215. get {
  216. if (_currentEditOldValues == null)
  217. _currentEditOldValues = new OrderedDictionary ();
  218. return _currentEditOldValues;
  219. }
  220. }
  221. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  222. [EditorBrowsable (EditorBrowsableState.Never)]
  223. [Browsable (false)]
  224. public override string AccessKey {
  225. get { return base.AccessKey; }
  226. set { throw StylingNotSupported (); }
  227. }
  228. [PersistenceMode (PersistenceMode.InnerProperty)]
  229. [DefaultValue ("")]
  230. [Browsable (false)]
  231. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewDataItem), BindingDirection.TwoWay)]
  232. public virtual ITemplate AlternatingItemTemplate {
  233. get { return _alternatingItemTemplate; }
  234. set { _alternatingItemTemplate = value; }
  235. }
  236. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  237. [EditorBrowsable (EditorBrowsableState.Never)]
  238. [Browsable (false)]
  239. public override Color BackColor {
  240. get { return base.BackColor; }
  241. set { throw StylingNotSupported (); }
  242. }
  243. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  244. [Browsable (false)]
  245. [EditorBrowsable (EditorBrowsableState.Never)]
  246. public override Color BorderColor {
  247. get { return base.BorderColor; }
  248. set { throw StylingNotSupported (); }
  249. }
  250. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  251. [EditorBrowsable (EditorBrowsableState.Never)]
  252. [Browsable (false)]
  253. public override BorderStyle BorderStyle {
  254. get { return base.BorderStyle; }
  255. set { throw StylingNotSupported (); }
  256. }
  257. [Browsable (false)]
  258. [EditorBrowsable (EditorBrowsableState.Never)]
  259. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  260. public override Unit BorderWidth {
  261. get { return base.BorderWidth; }
  262. set { throw StylingNotSupported (); }
  263. }
  264. public override ControlCollection Controls {
  265. get {
  266. EnsureChildControls ();
  267. return base.Controls;
  268. }
  269. }
  270. [Category ("Behavior")]
  271. [DefaultValue (true)]
  272. public virtual bool ConvertEmptyStringToNull {
  273. get {
  274. object o = ViewState ["ConvertEmptyStringToNull"];
  275. if (o != null)
  276. return (bool) o;
  277. return true;
  278. }
  279. set { ViewState ["ConvertEmptyStringToNull"] = value; }
  280. }
  281. [EditorBrowsable (EditorBrowsableState.Never)]
  282. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  283. [Browsable (false)]
  284. [CssClassProperty]
  285. public override string CssClass {
  286. get { return base.CssClass; }
  287. set { throw StylingNotSupported (); }
  288. }
  289. [Editor ("System.Web.UI.Design.WebControls.DataFieldEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof (System.Drawing.Design.UITypeEditor))]
  290. [DefaultValue ("")]
  291. [TypeConverter (typeof (System.Web.UI.WebControls.StringArrayConverter))]
  292. [Category ("Data")]
  293. public virtual string [] DataKeyNames {
  294. get {
  295. if (_dataKeyNames != null)
  296. return _dataKeyNames;
  297. return new string [0];
  298. }
  299. set {
  300. if (value == null)
  301. _dataKeyNames = null;
  302. else
  303. _dataKeyNames = (string []) value.Clone ();
  304. // They will eventually be recreated while creating the child controls
  305. _dataKeyArray = null;
  306. _dataKeys = null;
  307. if (Initialized)
  308. RequiresDataBinding = true;
  309. }
  310. }
  311. [Browsable (false)]
  312. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  313. public virtual DataKeyArray DataKeys {
  314. get {
  315. if (_dataKeys == null) {
  316. _dataKeys = new DataKeyArray (DataKeyArray);
  317. if (IsTrackingViewState)
  318. ((IStateManager) _dataKeys).TrackViewState ();
  319. }
  320. return _dataKeys;
  321. }
  322. }
  323. ArrayList DataKeyArray {
  324. get {
  325. if (_dataKeyArray == null)
  326. _dataKeyArray = new ArrayList ();
  327. return _dataKeyArray;
  328. }
  329. }
  330. [DefaultValue (-1)]
  331. [Category ("Default")]
  332. public virtual int EditIndex {
  333. get { return _editIndex; }
  334. set {
  335. if (value < -1)
  336. throw new ArgumentOutOfRangeException ("value");
  337. if (value != _editIndex) {
  338. _editIndex = value;
  339. if (Initialized)
  340. RequiresDataBinding = true;
  341. }
  342. }
  343. }
  344. [Browsable (false)]
  345. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  346. public virtual ListViewItem EditItem {
  347. get {
  348. IList <ListViewDataItem> items = Items;
  349. if (_editIndex >= 0 && _editIndex < items.Count)
  350. return items [_editIndex];
  351. return null;
  352. }
  353. }
  354. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewDataItem), BindingDirection.TwoWay)]
  355. [PersistenceMode (PersistenceMode.InnerProperty)]
  356. [Browsable (false)]
  357. [DefaultValue ("")]
  358. public virtual ITemplate EditItemTemplate {
  359. get { return _editItemTemplate; }
  360. set { _editItemTemplate = value; }
  361. }
  362. [TemplateContainer (typeof (System.Web.UI.WebControls.ListView))]
  363. [PersistenceMode (PersistenceMode.InnerProperty)]
  364. [DefaultValue ("")]
  365. [Browsable (false)]
  366. public virtual ITemplate EmptyDataTemplate {
  367. get { return _emptyDataTemplate; }
  368. set { _emptyDataTemplate = value; }
  369. }
  370. [Browsable (false)]
  371. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewItem))]
  372. [DefaultValue ("")]
  373. [PersistenceMode (PersistenceMode.InnerProperty)]
  374. public virtual ITemplate EmptyItemTemplate {
  375. get { return _emptyItemTemplate; }
  376. set { _emptyItemTemplate = value; }
  377. }
  378. [WebCategory ("Behavior")]
  379. [DefaultValue (false)]
  380. [MonoTODO ("Figure out where it is used and what's the effect of setting it to true.")]
  381. public virtual bool EnableModelValidation {
  382. get {
  383. object o = ViewState ["EnableModelValidation"];
  384. if (o == null)
  385. return false;
  386. return (bool)o;
  387. }
  388. set {
  389. if (value)
  390. ViewState ["EnableModelValidation"] = value;
  391. }
  392. }
  393. [Browsable (false)]
  394. [EditorBrowsable (EditorBrowsableState.Never)]
  395. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  396. public override FontInfo Font {
  397. get { throw StylingNotSupported (); }
  398. }
  399. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  400. [EditorBrowsable (EditorBrowsableState.Never)]
  401. [Browsable (false)]
  402. public override Color ForeColor {
  403. get { return base.ForeColor; }
  404. set { throw StylingNotSupported (); }
  405. }
  406. [Category ("Default")]
  407. [DefaultValue (1)]
  408. public virtual int GroupItemCount {
  409. get { return _groupItemCount; }
  410. set {
  411. if (value < 1)
  412. throw new ArgumentOutOfRangeException ("value");
  413. if (value != _groupItemCount) {
  414. _groupItemCount = value;
  415. if (Initialized)
  416. RequiresDataBinding = true;
  417. }
  418. }
  419. }
  420. [Category ("Behavior")]
  421. [DefaultValue ("groupPlaceholder")]
  422. public virtual string GroupPlaceholderID {
  423. get {
  424. string s = ViewState ["GroupPlaceholderID"] as string;
  425. if (s != null)
  426. return s;
  427. return "groupPlaceholder";
  428. }
  429. set {
  430. if (String.IsNullOrEmpty (value))
  431. throw new ArgumentOutOfRangeException ("value");
  432. ViewState ["GroupPlaceholderID"] = value;
  433. }
  434. }
  435. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewItem))]
  436. [PersistenceMode (PersistenceMode.InnerProperty)]
  437. [Browsable (false)]
  438. [DefaultValue ("")]
  439. public virtual ITemplate GroupSeparatorTemplate {
  440. get { return _groupSeparatorTemplate; }
  441. set { _groupSeparatorTemplate = value; }
  442. }
  443. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewItem))]
  444. [PersistenceMode (PersistenceMode.InnerProperty)]
  445. [DefaultValue ("")]
  446. [Browsable (false)]
  447. public virtual ITemplate GroupTemplate {
  448. get { return _groupTemplate; }
  449. set { _groupTemplate = value; }
  450. }
  451. [EditorBrowsable (EditorBrowsableState.Never)]
  452. [Browsable (false)]
  453. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  454. public override Unit Height {
  455. get { return base.Height; }
  456. set { throw StylingNotSupported (); }
  457. }
  458. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  459. [Browsable (false)]
  460. public virtual ListViewItem InsertItem {
  461. get;
  462. private set;
  463. }
  464. [Category ("Default")]
  465. [DefaultValue (InsertItemPosition.None)]
  466. public virtual InsertItemPosition InsertItemPosition {
  467. get;
  468. set;
  469. }
  470. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewItem), BindingDirection.TwoWay)]
  471. [PersistenceMode (PersistenceMode.InnerProperty)]
  472. [DefaultValue ("")]
  473. [Browsable (false)]
  474. public virtual ITemplate InsertItemTemplate {
  475. get { return _insertItemTemplate; }
  476. set { _insertItemTemplate = value; }
  477. }
  478. [DefaultValue ("itemPlaceholder")]
  479. [Category ("Behavior")]
  480. public virtual string ItemPlaceholderID {
  481. get {
  482. string s = ViewState ["ItemPlaceHolderID"] as string;
  483. if (s != null)
  484. return s;
  485. return "itemPlaceholder";
  486. }
  487. set {
  488. if (String.IsNullOrEmpty (value))
  489. throw new ArgumentOutOfRangeException ("value");
  490. ViewState ["ItemPlaceHolderID"] = value;
  491. }
  492. }
  493. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  494. [Browsable (false)]
  495. public virtual IList <ListViewDataItem> Items {
  496. get {
  497. if (_items == null)
  498. _items = new List <ListViewDataItem> ();
  499. return _items;
  500. }
  501. }
  502. [PersistenceMode (PersistenceMode.InnerProperty)]
  503. [DefaultValue ("")]
  504. [Browsable (false)]
  505. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewItem))]
  506. public virtual ITemplate ItemSeparatorTemplate {
  507. get { return _itemSeparatorTemplate; }
  508. set { _itemSeparatorTemplate = value; }
  509. }
  510. [Browsable (false)]
  511. [PersistenceMode (PersistenceMode.InnerProperty)]
  512. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewDataItem), BindingDirection.TwoWay)]
  513. [DefaultValue ("")]
  514. public virtual ITemplate ItemTemplate {
  515. get { return _itemTemplate; }
  516. set { _itemTemplate = value; }
  517. }
  518. [TemplateContainer (typeof (System.Web.UI.WebControls.ListView))]
  519. [PersistenceMode (PersistenceMode.InnerProperty)]
  520. [DefaultValue ("")]
  521. [Browsable (false)]
  522. public virtual ITemplate LayoutTemplate {
  523. get { return _layoutTemplate; }
  524. set { _layoutTemplate = value; }
  525. }
  526. protected virtual int MaximumRows {
  527. get { return _maximumRows; }
  528. }
  529. [Browsable (false)]
  530. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  531. public virtual DataKey SelectedDataKey {
  532. get {
  533. if (_dataKeyNames == null || _dataKeyNames.Length == 0)
  534. throw new InvalidOperationException ("Data keys must be specified on ListView '" + ID + "' before the selected data keys can be retrieved. Use the DataKeyNames property to specify data keys.");
  535. DataKeyArray dataKeys = DataKeys;
  536. int selIndex = SelectedIndex;
  537. if (selIndex > -1 && selIndex < dataKeys.Count)
  538. return dataKeys [selIndex];
  539. return null;
  540. }
  541. }
  542. [Browsable (false)]
  543. public virtual DataKey SelectedPersistedDataKey {
  544. get;
  545. set;
  546. }
  547. [Category ("Default")]
  548. [DefaultValue (-1)]
  549. public virtual int SelectedIndex {
  550. get { return _selectedIndex; }
  551. set {
  552. if (value < -1)
  553. throw new ArgumentOutOfRangeException ("value");
  554. if (value != _selectedIndex) {
  555. _selectedIndex = value;
  556. if (Initialized)
  557. RequiresDataBinding = true;
  558. }
  559. }
  560. }
  561. [PersistenceMode (PersistenceMode.InnerProperty)]
  562. [DefaultValue ("")]
  563. [Browsable (false)]
  564. [TemplateContainer (typeof (System.Web.UI.WebControls.ListViewDataItem), BindingDirection.TwoWay)]
  565. public virtual ITemplate SelectedItemTemplate {
  566. get { return _selectedItemTemplate; }
  567. set { _selectedItemTemplate = value; }
  568. }
  569. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  570. [Browsable (false)]
  571. public object SelectedValue {
  572. get {
  573. DataKey dk = SelectedDataKey;
  574. if (dk != null)
  575. return dk.Value;
  576. return null;
  577. }
  578. }
  579. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  580. [Browsable (false)]
  581. [DefaultValue (SortDirection.Ascending)]
  582. [PersistenceMode (PersistenceMode.InnerProperty)]
  583. public virtual SortDirection SortDirection {
  584. get { return _sortDirection; }
  585. }
  586. [Browsable (false)]
  587. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  588. public virtual string SortExpression {
  589. get { return _sortExpression; }
  590. }
  591. protected virtual int StartRowIndex {
  592. get {
  593. if (_startRowIndex < 0)
  594. return 0;
  595. return _startRowIndex;
  596. }
  597. }
  598. int IPageableItemContainer.MaximumRows {
  599. get { return MaximumRows; }
  600. }
  601. int IPageableItemContainer.StartRowIndex {
  602. get { return StartRowIndex; }
  603. }
  604. [EditorBrowsable (EditorBrowsableState.Never)]
  605. [Browsable (false)]
  606. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  607. public override short TabIndex {
  608. get { return 0; }
  609. set { throw new NotSupportedException ("ListView does not allow setting this property."); }
  610. }
  611. [EditorBrowsable (EditorBrowsableState.Never)]
  612. [Browsable (false)]
  613. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  614. public override string ToolTip {
  615. get { return base.ToolTip; }
  616. set { throw StylingNotSupported (); }
  617. }
  618. [EditorBrowsable (EditorBrowsableState.Never)]
  619. [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
  620. [Browsable (false)]
  621. public override Unit Width {
  622. get { return base.Width; }
  623. set { throw StylingNotSupported (); }
  624. }
  625. #endregion
  626. public ListView ()
  627. {
  628. InsertItemPosition = InsertItemPosition.None;
  629. ResetDefaults ();
  630. }
  631. void ResetDefaults ()
  632. {
  633. _totalRowCount = -1;
  634. _selectedIndex = -1;
  635. _editIndex = -1;
  636. _groupItemCount = 1;
  637. }
  638. protected virtual void AddControlToContainer (Control control, Control container, int addLocation)
  639. {
  640. if (control == null)
  641. throw new ArgumentNullException ("control");
  642. // .NET doesn't check container for null (!)
  643. // if (container == null)
  644. // throw new ArgumentNullException ("container");
  645. Control ctl;
  646. if (container is HtmlTable) {
  647. ctl = new ListViewTableRow ();
  648. ctl.Controls.Add (control);
  649. } else if (container is HtmlTableRow) {
  650. ctl = new ListViewTableCell ();
  651. ctl.Controls.Add (control);
  652. } else
  653. ctl = control;
  654. container.Controls.AddAt (addLocation, ctl);
  655. }
  656. protected internal override void CreateChildControls ()
  657. {
  658. object itemCount = ViewState ["_!ItemCount"];
  659. if (itemCount != null) {
  660. int c = (int)itemCount;
  661. if (c >= 0) {
  662. // Fake data - we only need to make sure
  663. // OnTotalRowCountAvailable is called now - so that any
  664. // pagers can create child controls.
  665. object[] data = new object [c];
  666. CreateChildControls (data, false);
  667. }
  668. } else if (RequiresDataBinding)
  669. EnsureDataBound ();
  670. base.CreateChildControls ();
  671. }
  672. protected virtual int CreateChildControls (IEnumerable dataSource, bool dataBinding)
  673. {
  674. IList <ListViewDataItem> retList = null;
  675. EnsureLayoutTemplate ();
  676. RemoveItems ();
  677. // If any of the _maximumRows or _startRowIndex is different to their
  678. // defaults, it means we are paging - i.e. SetPageProperties has been
  679. // called.
  680. bool haveDataToPage = _maximumRows > 0 || _startRowIndex > 0;
  681. var pagedDataSource = new ListViewPagedDataSource ();
  682. if (dataBinding) {
  683. DataSourceView view = GetData ();
  684. if (view == null)
  685. throw new InvalidOperationException ("dataSource returned a null reference for DataSourceView.");
  686. int totalRowCount = 0;
  687. if (haveDataToPage && view.CanPage) {
  688. if (view.CanRetrieveTotalRowCount)
  689. totalRowCount = SelectArguments.TotalRowCount;
  690. else {
  691. ICollection ds = dataSource as ICollection;
  692. if (ds == null)
  693. throw new InvalidOperationException ("dataSource does not implement the ICollection interface.");
  694. totalRowCount = ds.Count + StartRowIndex;
  695. }
  696. }
  697. pagedDataSource.TotalRowCount = totalRowCount;
  698. _totalRowCount = totalRowCount;
  699. DataKeyArray.Clear ();
  700. } else {
  701. if (!(dataSource is ICollection))
  702. throw new InvalidOperationException ("dataSource does not implement the ICollection interface and dataBinding is false.");
  703. pagedDataSource.TotalRowCount = 0;
  704. _totalRowCount = -1;
  705. }
  706. pagedDataSource.StartRowIndex = StartRowIndex;
  707. pagedDataSource.MaximumRows = MaximumRows;
  708. pagedDataSource.DataSource = dataSource;
  709. bool emptySet = false;
  710. if (dataSource != null) {
  711. if (GroupItemCount <= 1 && GroupTemplate == null)
  712. retList = CreateItemsWithoutGroups (pagedDataSource, dataBinding, InsertItemPosition, DataKeyArray);
  713. else
  714. retList = CreateItemsInGroups (pagedDataSource, dataBinding, InsertItemPosition, DataKeyArray);
  715. if (retList == null || retList.Count == 0)
  716. emptySet = true;
  717. if (haveDataToPage) {
  718. // Data source has paged data for us, so we must use its total row
  719. // count
  720. _totalRowCount = pagedDataSource.TotalRowCount;
  721. } else if (!emptySet && _totalRowCount > -1)
  722. _totalRowCount = retList.Count;
  723. else if (_totalRowCount > -1)
  724. _totalRowCount = 0;
  725. OnTotalRowCountAvailable (new PageEventArgs (_startRowIndex, _maximumRows, _totalRowCount));
  726. } else
  727. emptySet = true;
  728. if (emptySet) {
  729. Controls.Clear ();
  730. CreateEmptyDataItem ();
  731. }
  732. if (retList == null)
  733. return 0;
  734. return _totalRowCount;
  735. }
  736. protected override Style CreateControlStyle ()
  737. {
  738. throw StylingNotSupported ();
  739. }
  740. protected virtual ListViewDataItem CreateDataItem (int dataItemIndex, int displayIndex)
  741. {
  742. return new ListViewDataItem (dataItemIndex, displayIndex);
  743. }
  744. protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
  745. {
  746. DataSourceSelectArguments arg = DataSourceSelectArguments.Empty;
  747. DataSourceView view = GetData();
  748. if (view.CanPage) {
  749. arg.StartRowIndex = _startRowIndex;
  750. if (view.CanRetrieveTotalRowCount) {
  751. arg.RetrieveTotalRowCount = true;
  752. arg.MaximumRows = _maximumRows;
  753. } else
  754. arg.MaximumRows = -1;
  755. }
  756. if (IsBoundUsingDataSourceID && !String.IsNullOrEmpty (_sortExpression)) {
  757. if (_sortDirection == SortDirection.Ascending)
  758. arg.SortExpression = _sortExpression;
  759. else
  760. arg.SortExpression = _sortExpression + " DESC";
  761. }
  762. return arg;
  763. }
  764. protected virtual void CreateEmptyDataItem ()
  765. {
  766. if (_emptyDataTemplate != null) {
  767. ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
  768. InstantiateEmptyDataTemplate (item);
  769. OnItemCreated (new ListViewItemEventArgs (item));
  770. AddControlToContainer (item, this, 0);
  771. }
  772. }
  773. protected virtual ListViewItem CreateEmptyItem ()
  774. {
  775. if (_emptyItemTemplate != null) {
  776. ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
  777. InstantiateEmptyItemTemplate (item);
  778. OnItemCreated (new ListViewItemEventArgs (item));
  779. return item;
  780. }
  781. return null;
  782. }
  783. protected virtual ListViewItem CreateInsertItem ()
  784. {
  785. if (_insertItemTemplate == null)
  786. // .NET throws a different message, but it's incorrect so we'll use
  787. // this one
  788. throw new InvalidOperationException ("The ListView control '" + ID + "' does not have an InsertItemTemplate template specified.");
  789. ListViewItem ret = CreateItem (ListViewItemType.InsertItem);
  790. InstantiateInsertItemTemplate (ret);
  791. OnItemCreated (new ListViewItemEventArgs (ret));
  792. InsertItem = ret;
  793. return ret;
  794. }
  795. protected virtual ListViewItem CreateItem (ListViewItemType itemType)
  796. {
  797. return new ListViewItem (itemType);
  798. }
  799. void InsertSeparatorItem (Control container, int position)
  800. {
  801. Control control = CreateItem (ListViewItemType.DataItem);
  802. InstantiateItemSeparatorTemplate (control);
  803. AddControlToContainer (control, container, position);
  804. }
  805. ListViewDataItem InsertDataItem (object dataItem, Control container, bool dataBinding, ArrayList keyArray, int startIndex, int position, ref int displayIndex)
  806. {
  807. ListViewDataItem lvdi = CreateDataItem (startIndex + displayIndex, displayIndex);
  808. InstantiateItemTemplate (lvdi, displayIndex);
  809. if (dataBinding) {
  810. lvdi.DataItem = dataItem;
  811. OrderedDictionary dict = new OrderedDictionary ();
  812. string[] dataKeyNames = DataKeyNames;
  813. foreach (string s in dataKeyNames)
  814. dict.Add (s, DataBinder.GetPropertyValue (dataItem, s));
  815. DataKey dk = new DataKey (dict, dataKeyNames);
  816. if (keyArray.Count == displayIndex)
  817. keyArray.Add (dk);
  818. else
  819. keyArray [displayIndex] = dk;
  820. }
  821. OnItemCreated (new ListViewItemEventArgs (lvdi));
  822. AddControlToContainer (lvdi, container, position);
  823. if (dataBinding) {
  824. lvdi.DataBind ();
  825. OnItemDataBound (new ListViewItemEventArgs (lvdi));
  826. }
  827. displayIndex++;
  828. return lvdi;
  829. }
  830. protected virtual IList <ListViewDataItem> CreateItemsInGroups (ListViewPagedDataSource dataSource, bool dataBinding, InsertItemPosition insertPosition,
  831. ArrayList keyArray)
  832. {
  833. if (_groupTemplate == null)
  834. return null;
  835. if (_groupedItemsContainer == null)
  836. _groupedItemsContainer = FindPlaceholder (GroupPlaceholderID, this);
  837. if (_groupedItemsContainer == null)
  838. throw NoPlaceholder (true);
  839. Control parent = _groupedItemsContainer.Parent;
  840. int gpos;
  841. if (_groupedItemsContainerPlaceholderIndex == -1) {
  842. gpos = 0;
  843. if (parent != null) {
  844. gpos = parent.Controls.IndexOf (_groupedItemsContainer);
  845. parent.Controls.Remove (_groupedItemsContainer);
  846. _groupedItemsContainer = parent;
  847. if (_groupedItemsContainer != _layoutTemplatePlaceholder)
  848. AddControlToContainer (_groupedItemsContainer, _layoutTemplatePlaceholder, 0);
  849. }
  850. _groupedItemsContainerPlaceholderIndex = gpos;
  851. } else {
  852. gpos = _groupedItemsContainerPlaceholderIndex;
  853. ResetChildNames (_firstIdAfterLayoutTemplate);
  854. }
  855. IList <ListViewDataItem> ret = Items;
  856. ret.Clear ();
  857. int firstItemIndexInGroup = -1;
  858. Control currentGroup = StartNewGroup (false, ref gpos, ref firstItemIndexInGroup);
  859. int groupItemCount = GroupItemCount;
  860. int itemPosInGroup = firstItemIndexInGroup;
  861. int groupItemCounter = groupItemCount;
  862. ListViewItem lvi;
  863. ListViewItem container;
  864. bool needSeparator = false;
  865. bool haveSeparatorTemplate = _itemSeparatorTemplate != null;
  866. if (insertPosition == InsertItemPosition.FirstItem) {
  867. lvi = CreateInsertItem ();
  868. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  869. groupItemCounter--;
  870. needSeparator = true;
  871. }
  872. int displayIndex = 0;
  873. ListViewDataItem lvdi;
  874. int startIndex = dataSource.StartRowIndex;
  875. int dataCount = dataSource.Count;
  876. int numberOfGroups = (dataCount / groupItemCount) + (dataCount % groupItemCount) - 1;
  877. GroupStart groupStart = () => {
  878. if (groupItemCounter <= 0) {
  879. groupItemCounter = groupItemCount;
  880. currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
  881. numberOfGroups--;
  882. itemPosInGroup = firstItemIndexInGroup;
  883. _groupedItemsContainerItemCount++;
  884. needSeparator = false;
  885. }
  886. };
  887. foreach (object item in dataSource) {
  888. groupStart ();
  889. if (needSeparator && haveSeparatorTemplate)
  890. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  891. ret.Add (InsertDataItem (item, currentGroup, dataBinding, keyArray, startIndex, itemPosInGroup++, ref displayIndex));
  892. groupItemCounter--;
  893. if (!needSeparator)
  894. needSeparator = true;
  895. }
  896. groupStart ();
  897. if (insertPosition == InsertItemPosition.LastItem) {
  898. if (needSeparator && haveSeparatorTemplate)
  899. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  900. groupStart ();
  901. lvi = CreateInsertItem ();
  902. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  903. groupItemCounter--;
  904. }
  905. if (groupItemCounter > 0 && _emptyItemTemplate != null) {
  906. while (groupItemCounter > 0) {
  907. if (haveSeparatorTemplate)
  908. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  909. lvi = CreateEmptyItem ();
  910. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  911. groupItemCounter--;
  912. }
  913. }
  914. return ret;
  915. }
  916. Control StartNewGroup (bool needSeparator, ref int position, ref int firstItemIndexInGroup)
  917. {
  918. Control control = new ListViewContainer ();
  919. InstantiateGroupTemplate (control);
  920. Control placeholder = FindPlaceholder (ItemPlaceholderID, control);
  921. if (placeholder == null)
  922. throw NoPlaceholder (false);
  923. Control parent = placeholder.Parent;
  924. firstItemIndexInGroup = parent.Controls.IndexOf (placeholder);
  925. if (needSeparator) {
  926. Control separator = new Control ();
  927. InstantiateGroupSeparatorTemplate (separator);
  928. if (separator.Controls.Count > 0) {
  929. AddControlToContainer (separator, _groupedItemsContainer, position++);
  930. _groupedItemsContainerItemCount++;
  931. } else
  932. separator = null;
  933. }
  934. parent.Controls.RemoveAt (firstItemIndexInGroup);
  935. AddControlToContainer (control, _groupedItemsContainer, position++);
  936. return parent;
  937. }
  938. protected virtual IList <ListViewDataItem> CreateItemsWithoutGroups (ListViewPagedDataSource dataSource, bool dataBinding, InsertItemPosition insertPosition,
  939. ArrayList keyArray)
  940. {
  941. if (_nonGroupedItemsContainer == null)
  942. _nonGroupedItemsContainer = FindPlaceholder (ItemPlaceholderID, this);
  943. _nonGroupedItemsContainerItemCount = 0;
  944. if (_nonGroupedItemsContainer == null)
  945. throw NoPlaceholder (false);
  946. Control parent = _nonGroupedItemsContainer.Parent;
  947. int ipos;
  948. if (_nonGroupedItemsContainerFirstItemIndex == -1) {
  949. ipos = 0;
  950. if (parent != null) {
  951. ipos = parent.Controls.IndexOf (_nonGroupedItemsContainer);
  952. parent.Controls.Remove (_nonGroupedItemsContainer);
  953. _nonGroupedItemsContainer = parent;
  954. if (_nonGroupedItemsContainer != _layoutTemplatePlaceholder)
  955. AddControlToContainer (_nonGroupedItemsContainer, _layoutTemplatePlaceholder, 0);
  956. }
  957. _nonGroupedItemsContainerFirstItemIndex = ipos;
  958. } else {
  959. ipos = _nonGroupedItemsContainerFirstItemIndex;
  960. ResetChildNames (_firstIdAfterLayoutTemplate);
  961. }
  962. IList <ListViewDataItem> ret = Items;
  963. ret.Clear ();
  964. ListViewItem lvi;
  965. ListViewItem container;
  966. bool needSeparator = false;
  967. if (insertPosition == InsertItemPosition.FirstItem) {
  968. lvi = CreateInsertItem ();
  969. AddControlToContainer (lvi, _nonGroupedItemsContainer, ipos++);
  970. _nonGroupedItemsContainerItemCount++;
  971. needSeparator = true;
  972. }
  973. bool haveSeparatorTemplate = _itemSeparatorTemplate != null;
  974. int displayIndex = 0;
  975. int startIndex = dataSource.StartRowIndex;
  976. foreach (object item in dataSource) {
  977. if (needSeparator && haveSeparatorTemplate) {
  978. InsertSeparatorItem (_nonGroupedItemsContainer, ipos++);
  979. _nonGroupedItemsContainerItemCount++;
  980. }
  981. ret.Add (InsertDataItem (item, _nonGroupedItemsContainer, dataBinding, keyArray, startIndex, ipos++, ref displayIndex));
  982. _nonGroupedItemsContainerItemCount++;
  983. if (!needSeparator)
  984. needSeparator = true;
  985. }
  986. if (insertPosition == InsertItemPosition.LastItem) {
  987. if (needSeparator && haveSeparatorTemplate) {
  988. container = new ListViewItem ();
  989. InstantiateItemSeparatorTemplate (container);
  990. AddControlToContainer (container, _nonGroupedItemsContainer, ipos++);
  991. _nonGroupedItemsContainerItemCount++;
  992. }
  993. lvi = CreateInsertItem ();
  994. AddControlToContainer (lvi, _nonGroupedItemsContainer, ipos++);
  995. _nonGroupedItemsContainerItemCount++;
  996. }
  997. return ret;
  998. }
  999. protected virtual void CreateLayoutTemplate ()
  1000. {
  1001. if (_layoutTemplate != null) {
  1002. _layoutTemplatePlaceholder = new Control ();
  1003. _layoutTemplate.InstantiateIn (_layoutTemplatePlaceholder);
  1004. Controls.Add (_layoutTemplatePlaceholder);
  1005. }
  1006. OnLayoutCreated (EventArgs.Empty);
  1007. }
  1008. public virtual void DeleteItem (int itemIndex)
  1009. {
  1010. if (itemIndex < 0)
  1011. throw new InvalidOperationException ("itemIndex is less than 0.");
  1012. IList <ListViewDataItem> items = Items;
  1013. if (itemIndex < items.Count)
  1014. DoDelete (items [itemIndex], itemIndex);
  1015. }
  1016. protected virtual void EnsureLayoutTemplate ()
  1017. {
  1018. if (Controls.Count != 0)
  1019. return;
  1020. CreateLayoutTemplate ();
  1021. _firstIdAfterLayoutTemplate = GetDefaultNumberID ();
  1022. }
  1023. public virtual void ExtractItemValues (IOrderedDictionary itemValues, ListViewItem item, bool includePrimaryKey)
  1024. {
  1025. if (itemValues == null)
  1026. throw new ArgumentNullException ("itemValues");
  1027. IBindableTemplate bt = null;
  1028. if (item.ItemType == ListViewItemType.DataItem) {
  1029. ListViewDataItem dataItem = item as ListViewDataItem;
  1030. if (dataItem == null)
  1031. throw new InvalidOperationException ("item is not a ListViewDataItem object.");
  1032. int displayIndex = dataItem.DisplayIndex;
  1033. if (_editItemTemplate != null && displayIndex == EditIndex)
  1034. bt = (IBindableTemplate) _editItemTemplate;
  1035. else if (_selectedItemTemplate != null && (displayIndex == SelectedIndex))
  1036. bt = (IBindableTemplate) _selectedItemTemplate;
  1037. else if (_alternatingItemTemplate != null && (displayIndex % 2 != 0))
  1038. bt = (IBindableTemplate) _alternatingItemTemplate;
  1039. else
  1040. bt = (IBindableTemplate) _itemTemplate;
  1041. } else if (_insertItemTemplate != null && item.ItemType == ListViewItemType.InsertItem)
  1042. bt = (IBindableTemplate) _insertItemTemplate;
  1043. if (bt == null)
  1044. return;
  1045. IOrderedDictionary values = bt.ExtractValues (item);
  1046. if (values == null || values.Count == 0)
  1047. return;
  1048. string[] keyNames = includePrimaryKey ? null : DataKeyNames;
  1049. bool haveKeyNames = keyNames != null && keyNames.Length > 0;
  1050. object key, value;
  1051. string s;
  1052. bool convertEmptyStringToNull = ConvertEmptyStringToNull;
  1053. foreach (DictionaryEntry de in values) {
  1054. key = de.Key;
  1055. if (includePrimaryKey || (haveKeyNames && Array.IndexOf (keyNames, key) != -1)) {
  1056. value = de.Value;
  1057. if (convertEmptyStringToNull) {
  1058. s = value as string;
  1059. if (s != null && s.Length == 0)
  1060. value = null;
  1061. }
  1062. itemValues [key] = value;
  1063. }
  1064. }
  1065. }
  1066. protected virtual Control FindPlaceholder (string containerID, Control container)
  1067. {
  1068. // .NET doesn't check whether container is null (!)
  1069. if (String.IsNullOrEmpty (containerID))
  1070. return null;
  1071. if (container.ID == containerID)
  1072. return container;
  1073. Control ret = container.FindControl (containerID);
  1074. if (ret != null)
  1075. return ret;
  1076. foreach (Control c in container.Controls) {
  1077. ret = FindPlaceholder (containerID, c);
  1078. if (ret != null)
  1079. return ret;
  1080. }
  1081. return null;
  1082. }
  1083. public virtual void InsertNewItem (bool causesValidation)
  1084. {
  1085. ListViewItem insertItem = InsertItem;
  1086. if (insertItem == null)
  1087. throw new InvalidOperationException ("The ListView control does not have an insert item.");
  1088. if (causesValidation) {
  1089. Page page = Page;
  1090. if (page != null)
  1091. page.Validate ();
  1092. }
  1093. DoInsert (insertItem, causesValidation);
  1094. }
  1095. public virtual void UpdateItem (int itemIndex, bool causesValidation)
  1096. {
  1097. if (itemIndex < 0)
  1098. throw new InvalidOperationException ("itemIndex is less than 0.");
  1099. IList <ListViewDataItem> items = Items;
  1100. if (itemIndex > items.Count)
  1101. return;
  1102. if (causesValidation) {
  1103. Page page = Page;
  1104. if (page != null)
  1105. page.Validate ();
  1106. }
  1107. DoUpdate (items [itemIndex], itemIndex, causesValidation);
  1108. }
  1109. protected virtual void InstantiateEmptyDataTemplate (Control container)
  1110. {
  1111. if (_emptyDataTemplate != null)
  1112. _emptyDataTemplate.InstantiateIn (container);
  1113. }
  1114. protected virtual void InstantiateEmptyItemTemplate (Control container)
  1115. {
  1116. if (_emptyItemTemplate != null)
  1117. _emptyItemTemplate.InstantiateIn (container);
  1118. }
  1119. protected virtual void InstantiateGroupSeparatorTemplate (Control container)
  1120. {
  1121. if (_groupSeparatorTemplate != null)
  1122. _groupSeparatorTemplate.InstantiateIn (container);
  1123. }
  1124. protected virtual void InstantiateGroupTemplate (Control container)
  1125. {
  1126. if (_groupTemplate != null)
  1127. _groupTemplate.InstantiateIn (container);
  1128. }
  1129. protected virtual void InstantiateInsertItemTemplate (Control container)
  1130. {
  1131. if (_insertItemTemplate != null)
  1132. _insertItemTemplate.InstantiateIn (container);
  1133. }
  1134. protected virtual void InstantiateItemSeparatorTemplate (Control container)
  1135. {
  1136. if (_itemSeparatorTemplate != null)
  1137. _itemSeparatorTemplate.InstantiateIn (container);
  1138. }
  1139. protected virtual void InstantiateItemTemplate (Control container, int displayIndex)
  1140. {
  1141. if (_itemTemplate == null)
  1142. throw new InvalidOperationException ("ItemTemplate is missing");
  1143. ITemplate template = _itemTemplate;
  1144. if (_alternatingItemTemplate != null && (displayIndex % 2 != 0))
  1145. template = _alternatingItemTemplate;
  1146. if (_selectedItemTemplate != null && (displayIndex == _selectedIndex))
  1147. template = _selectedItemTemplate;
  1148. if (_editItemTemplate != null && (displayIndex == _editIndex))
  1149. template = _editItemTemplate;
  1150. template.InstantiateIn (container);
  1151. }
  1152. void LoadDataKeysState (object savedState)
  1153. {
  1154. object[] state = savedState as object[];
  1155. int len = state != null ? state.Length : 0;
  1156. if (len == 0)
  1157. return;
  1158. ArrayList dataKeyArray = DataKeyArray;
  1159. DataKey dk;
  1160. string[] keyNames = DataKeyNames;
  1161. for (int i = 0; i < len; i++) {
  1162. dk = new DataKey (new OrderedDictionary (), keyNames);
  1163. ((IStateManager)dk).LoadViewState (state [i]);
  1164. dataKeyArray.Add (dk);
  1165. }
  1166. _dataKeys = null;
  1167. }
  1168. protected override void LoadControlState (object savedState)
  1169. {
  1170. ResetDefaults ();
  1171. object[] state = savedState as object[];
  1172. if (state == null || state.Length != CSTATE_COUNT)
  1173. return;
  1174. object o;
  1175. base.LoadControlState (state [CSTATE_BASE_STATE]);
  1176. if ((o = state [CSTATE_DATAKEYNAMES]) != null)
  1177. DataKeyNames = (string[])o;
  1178. LoadDataKeysState (state [CSTATE_DATAKEYSSTATE]);
  1179. if ((o = state [CSTATE_GROUPITEMCOUNT]) != null)
  1180. GroupItemCount = (int)o;
  1181. if ((o = state [CSTATE_TOTALROWCOUNT]) != null)
  1182. _totalRowCount = (int)o;
  1183. if ((o = state [CSTATE_EDITINDEX]) != null)
  1184. EditIndex = (int)o;
  1185. if ((o = state [CSTATE_SELECTEDINDEX]) != null)
  1186. SelectedIndex = (int)o;
  1187. if ((o = state [CSTATE_SORTDIRECTION]) != null)
  1188. _sortDirection = (SortDirection)o;
  1189. if ((o = state [CSTATE_SORTEXPRESSION]) != null)
  1190. _sortExpression = (string)o;
  1191. OnTotalRowCountAvailable (new PageEventArgs (_startRowIndex, _maximumRows, _totalRowCount));
  1192. }
  1193. protected override void LoadViewState (object savedState)
  1194. {
  1195. object[] state = savedState as object[];
  1196. int len = state != null ? state.Length : 0;
  1197. if (len == 0)
  1198. return;
  1199. base.LoadViewState (state [0]);
  1200. object[] values = state [0] as object[];
  1201. if (values == null || values.Length == 0)
  1202. return;
  1203. Pair pair;
  1204. IOrderedDictionary currentEditOldValues = CurrentEditOldValues;
  1205. currentEditOldValues.Clear ();
  1206. foreach (object value in values) {
  1207. pair = value as Pair;
  1208. if (pair == null)
  1209. continue;
  1210. currentEditOldValues.Add (pair.First, pair.Second);
  1211. }
  1212. }
  1213. protected override bool OnBubbleEvent (object source, EventArgs e)
  1214. {
  1215. ListViewCommandEventArgs args = e as ListViewCommandEventArgs;
  1216. if (args == null)
  1217. args = new ListViewCommandEventArgs (CreateItem (ListViewItemType.EmptyItem), source, e as CommandEventArgs);
  1218. if (args != null) {
  1219. bool causesValidation = false;
  1220. IButtonControl button = args.CommandSource as IButtonControl;
  1221. if (button != null && button.CausesValidation) {
  1222. Page.Validate (button.ValidationGroup);
  1223. causesValidation = true;
  1224. }
  1225. ProcessCommand (args, causesValidation);
  1226. return true;
  1227. }
  1228. return base.OnBubbleEvent (source, e);
  1229. }
  1230. void ProcessCommand (ListViewCommandEventArgs args, bool causesValidation)
  1231. {
  1232. OnItemCommand (args);
  1233. string commandName = args.CommandName;
  1234. string commandArgument = args.CommandArgument as string;
  1235. if (String.Compare (commandName, DataControlCommands.SortCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1236. Sort (commandArgument, DetermineSortDirection (commandArgument));
  1237. else if (String.Compare (commandName, DataControlCommands.EditCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1238. DoEdit (args);
  1239. else if (String.Compare (commandName, DataControlCommands.CancelCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1240. DoCancel (args);
  1241. else if (String.Compare (commandName, DataControlCommands.DeleteCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1242. DoDelete (args);
  1243. else if (String.Compare (commandName, DataControlCommands.InsertCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1244. DoInsert (args, causesValidation);
  1245. else if (String.Compare (commandName, DataControlCommands.SelectCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1246. DoSelect (args);
  1247. else if (String.Compare (commandName, DataControlCommands.UpdateCommandName, StringComparison.OrdinalIgnoreCase) == 0) {
  1248. if (causesValidation) {
  1249. Page page = Page;
  1250. if (page != null && !page.IsValid)
  1251. return;
  1252. }
  1253. DoUpdate (args, causesValidation);
  1254. }
  1255. }
  1256. int GetItemIndex (ListViewDataItem item)
  1257. {
  1258. if (item == null)
  1259. return -1;
  1260. int index = item.DisplayIndex;
  1261. if (index < 0)
  1262. return -1;
  1263. return index;
  1264. }
  1265. void DoSelect (ListViewCommandEventArgs args)
  1266. {
  1267. ListViewDataItem item = args.Item as ListViewDataItem;
  1268. int index = GetItemIndex (item);
  1269. if (index < 0)
  1270. return;
  1271. var selectingArgs = new ListViewSelectEventArgs (index);
  1272. OnSelectedIndexChanging (selectingArgs);
  1273. if (selectingArgs.Cancel)
  1274. return;
  1275. SelectedIndex = selectingArgs.NewSelectedIndex;
  1276. OnSelectedIndexChanged (EventArgs.Empty);
  1277. }
  1278. void DoInsert (ListViewCommandEventArgs args, bool causesValidation)
  1279. {
  1280. ListViewItem item = args.Item as ListViewItem;
  1281. if (item == null)
  1282. return;
  1283. DoInsert (item, causesValidation);
  1284. }
  1285. void DoInsert (ListViewItem item, bool causesValidation)
  1286. {
  1287. if (causesValidation) {
  1288. Page page = Page;
  1289. if (page != null && !page.IsValid)
  1290. return;
  1291. }
  1292. DataSourceView view;
  1293. ListViewInsertEventArgs insertingArgs;
  1294. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1295. if (usingDataSourceID) {
  1296. view = GetData ();
  1297. if (view == null)
  1298. throw NoDataSourceView ();
  1299. insertingArgs = new ListViewInsertEventArgs (item);
  1300. ExtractItemValues (insertingArgs.Values, item, true);
  1301. } else {
  1302. view = null;
  1303. insertingArgs = new ListViewInsertEventArgs (item);
  1304. }
  1305. OnItemInserting (insertingArgs);
  1306. if (!usingDataSourceID || insertingArgs.Cancel)
  1307. return;
  1308. _lastInsertValues = insertingArgs.Values;
  1309. view.Insert (_lastInsertValues, DoInsertCallback);
  1310. }
  1311. bool DoInsertCallback (int recordsAffected, Exception ex)
  1312. {
  1313. var insertedArgs = new ListViewInsertedEventArgs (recordsAffected, ex, _lastInsertValues);
  1314. OnItemInserted (insertedArgs);
  1315. _lastInsertValues = null;
  1316. // This will effectively reset the insert values
  1317. if (!insertedArgs.KeepInInsertMode)
  1318. RequiresDataBinding = true;
  1319. return insertedArgs.ExceptionHandled;
  1320. }
  1321. static InvalidOperationException NoDataSourceView ()
  1322. {
  1323. return new InvalidOperationException ("DataSourceView associated with the ListView is null.");
  1324. }
  1325. InvalidOperationException NoPlaceholder (bool group)
  1326. {
  1327. return new InvalidOperationException (
  1328. String.Format ("A{0} {1} placeholder must be specified on ListView '{2}'. Specify a{0} {1} placeholder by setting a control's ID property to \"{3}\". The {1} placeholder control must also specify runat=\"server\".",
  1329. group ? "" : "n",
  1330. group ? "group" : "item",
  1331. ID,
  1332. group ? GroupPlaceholderID : ItemPlaceholderID));
  1333. }
  1334. void DoDelete (ListViewCommandEventArgs args)
  1335. {
  1336. ListViewDataItem item = args.Item as ListViewDataItem;
  1337. int index = GetItemIndex (item);
  1338. if (index < 0)
  1339. return;
  1340. DoDelete (item, index);
  1341. }
  1342. void DoDelete (ListViewDataItem item, int index)
  1343. {
  1344. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1345. var deletingArgs = new ListViewDeleteEventArgs (index);
  1346. if (usingDataSourceID) {
  1347. DataKeyArray dka = DataKeys;
  1348. if (index < dka.Count)
  1349. dka [index].Values.CopyTo (deletingArgs.Keys);
  1350. ExtractItemValues (deletingArgs.Values, item, true);
  1351. }
  1352. OnItemDeleting (deletingArgs);
  1353. if (!usingDataSourceID || deletingArgs.Cancel)
  1354. return;
  1355. DataSourceView view = GetData ();
  1356. if (view == null)
  1357. throw NoDataSourceView ();
  1358. _currentDeletingItemKeys = deletingArgs.Keys;
  1359. _currentDeletingItemValues = deletingArgs.Values;
  1360. view.Delete (_currentDeletingItemKeys, _currentDeletingItemValues, DoDeleteCallback);
  1361. }
  1362. bool DoDeleteCallback (int affectedRows, Exception exception)
  1363. {
  1364. var args = new ListViewDeletedEventArgs (affectedRows, exception, _currentDeletingItemKeys, _currentDeletingItemValues);
  1365. OnItemDeleted (args);
  1366. EditIndex = -1;
  1367. RequiresDataBinding = true;
  1368. return args.ExceptionHandled;
  1369. }
  1370. void DoUpdate (ListViewCommandEventArgs args, bool causesValidation)
  1371. {
  1372. ListViewDataItem item = args.Item as ListViewDataItem;
  1373. int index = GetItemIndex (item);
  1374. if (index < 0)
  1375. return;
  1376. DoUpdate (item, index, causesValidation);
  1377. }
  1378. void DoUpdate (ListViewDataItem item, int index, bool causesValidation)
  1379. {
  1380. if (causesValidation) {
  1381. Page page = Page;
  1382. if (page != null && !page.IsValid)
  1383. return;
  1384. }
  1385. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1386. var updatingArgs = new ListViewUpdateEventArgs (index);
  1387. if (usingDataSourceID) {
  1388. DataKeyArray dka = DataKeys;
  1389. if (index < dka.Count)
  1390. dka [index].Values.CopyTo (updatingArgs.Keys);
  1391. CurrentEditOldValues.CopyTo (updatingArgs.OldValues);
  1392. ExtractItemValues (updatingArgs.NewValues, item, true);
  1393. }
  1394. OnItemUpdating (updatingArgs);
  1395. if (!usingDataSourceID || updatingArgs.Cancel)
  1396. return;
  1397. DataSourceView view = GetData ();
  1398. if (view == null)
  1399. throw NoDataSourceView ();
  1400. _currentEditOldValues = updatingArgs.OldValues;
  1401. _currentEditNewValues = updatingArgs.NewValues;
  1402. view.Update (updatingArgs.Keys, _currentEditNewValues, _currentEditOldValues, DoUpdateCallback);
  1403. }
  1404. bool DoUpdateCallback (int affectedRows, Exception exception)
  1405. {
  1406. var args = new ListViewUpdatedEventArgs (affectedRows, exception, _currentEditNewValues, _currentEditOldValues);
  1407. OnItemUpdated (args);
  1408. if (!args.KeepInEditMode) {
  1409. EditIndex = -1;
  1410. RequiresDataBinding = true;
  1411. _currentEditOldValues = null;
  1412. _currentEditNewValues = null;
  1413. }
  1414. return args.ExceptionHandled;
  1415. }
  1416. void DoCancel (ListViewCommandEventArgs args)
  1417. {
  1418. ListViewDataItem item = args.Item as ListViewDataItem;
  1419. int index = GetItemIndex (item);
  1420. if (index < 0)
  1421. return;
  1422. ListViewCancelMode cancelMode;
  1423. if (index == EditIndex)
  1424. cancelMode = ListViewCancelMode.CancelingEdit;
  1425. else if (item.ItemType == ListViewItemType.InsertItem)
  1426. cancelMode = ListViewCancelMode.CancelingInsert;
  1427. else
  1428. throw new InvalidOperationException ("Item being cancelled is neither an edit item or insert item.");
  1429. var cancelArgs = new ListViewCancelEventArgs (index, cancelMode);
  1430. OnItemCanceling (cancelArgs);
  1431. if (cancelArgs.Cancel)
  1432. return;
  1433. if (cancelMode == ListViewCancelMode.CancelingEdit)
  1434. EditIndex = -1;
  1435. RequiresDataBinding = true;
  1436. }
  1437. void DoEdit (ListViewCommandEventArgs args)
  1438. {
  1439. int index = GetItemIndex (args.Item as ListViewDataItem);
  1440. if (index < 0)
  1441. return;
  1442. var editArgs = new ListViewEditEventArgs (index);
  1443. OnItemEditing (editArgs);
  1444. if (editArgs.Cancel)
  1445. return;
  1446. if (IsBoundUsingDataSourceID)
  1447. EditIndex = index;
  1448. RequiresDataBinding = true;
  1449. }
  1450. SortDirection DetermineSortDirection (string sortExpression)
  1451. {
  1452. SortDirection ret;
  1453. if (sortExpression != SortExpression)
  1454. return SortDirection.Ascending;
  1455. if (SortDirection == SortDirection.Ascending)
  1456. ret = SortDirection.Descending;
  1457. else
  1458. ret = SortDirection.Ascending;
  1459. return ret;
  1460. }
  1461. protected override void OnInit (EventArgs e)
  1462. {
  1463. Page.RegisterRequiresControlState (this);
  1464. base.OnInit (e);
  1465. }
  1466. void InvokeEvent <T> (object key, T args) where T : EventArgs
  1467. {
  1468. EventHandlerList events = Events;
  1469. if (events != null) {
  1470. EventHandler <T> eh = events [key] as EventHandler <T>;
  1471. if (eh != null)
  1472. eh (this, args);
  1473. }
  1474. }
  1475. void InvokeEvent (object key, EventArgs args)
  1476. {
  1477. EventHandlerList events = Events;
  1478. if (events != null) {
  1479. EventHandler eh = events [key] as EventHandler;
  1480. if (eh != null)
  1481. eh (this, args);
  1482. }
  1483. }
  1484. protected virtual void OnItemCanceling (ListViewCancelEventArgs e)
  1485. {
  1486. InvokeEvent <ListViewCancelEventArgs> (ItemCancellingEvent, e);
  1487. }
  1488. protected virtual void OnItemCommand (ListViewCommandEventArgs e)
  1489. {
  1490. InvokeEvent <ListViewCommandEventArgs> (ItemCommandEvent, e);
  1491. }
  1492. protected virtual void OnItemCreated (ListViewItemEventArgs e)
  1493. {
  1494. InvokeEvent <ListViewItemEventArgs> (ItemCreatedEvent, e);
  1495. }
  1496. protected virtual void OnItemDataBound (ListViewItemEventArgs e)
  1497. {
  1498. InvokeEvent <ListViewItemEventArgs> (ItemDataBoundEvent, e);
  1499. }
  1500. protected virtual void OnItemDeleted (ListViewDeletedEventArgs e)
  1501. {
  1502. InvokeEvent <ListViewDeletedEventArgs> (ItemDeletedEvent, e);
  1503. }
  1504. protected virtual void OnItemDeleting (ListViewDeleteEventArgs e)
  1505. {
  1506. InvokeEvent <ListViewDeleteEventArgs> (ItemDeletingEvent, e);
  1507. }
  1508. protected virtual void OnItemEditing (ListViewEditEventArgs e)
  1509. {
  1510. InvokeEvent <ListViewEditEventArgs> (ItemEditingEvent, e);
  1511. }
  1512. protected virtual void OnItemInserted (ListViewInsertedEventArgs e)
  1513. {
  1514. InvokeEvent <ListViewInsertedEventArgs> (ItemInsertedEvent, e);
  1515. }
  1516. protected virtual void OnItemInserting (ListViewInsertEventArgs e)
  1517. {
  1518. InvokeEvent <ListViewInsertEventArgs> (ItemInsertingEvent, e);
  1519. }
  1520. protected virtual void OnItemUpdated (ListViewUpdatedEventArgs e)
  1521. {
  1522. InvokeEvent <ListViewUpdatedEventArgs> (ItemUpdatedEvent, e);
  1523. }
  1524. protected virtual void OnItemUpdating (ListViewUpdateEventArgs e)
  1525. {
  1526. InvokeEvent <ListViewUpdateEventArgs> (ItemUpdatingEvent, e);
  1527. }
  1528. protected virtual void OnLayoutCreated (EventArgs e)
  1529. {
  1530. InvokeEvent (LayoutCreatedEvent, e);
  1531. }
  1532. protected virtual void OnPagePropertiesChanged (EventArgs e)
  1533. {
  1534. InvokeEvent (PagePropertiesChangedEvent, e);
  1535. }
  1536. protected virtual void OnPagePropertiesChanging (PagePropertiesChangingEventArgs e)
  1537. {
  1538. InvokeEvent (PagePropertiesChangingEvent, e);
  1539. }
  1540. protected virtual void OnSelectedIndexChanged (EventArgs e)
  1541. {
  1542. InvokeEvent (SelectedIndexChangedEvent, e);
  1543. }
  1544. protected virtual void OnSelectedIndexChanging (ListViewSelectEventArgs e)
  1545. {
  1546. InvokeEvent (SelectedIndexChangingEvent, e);
  1547. }
  1548. protected virtual void OnSorted (EventArgs e)
  1549. {
  1550. InvokeEvent (SortedEvent, e);
  1551. }
  1552. protected virtual void OnSorting (ListViewSortEventArgs e)
  1553. {
  1554. InvokeEvent <ListViewSortEventArgs> (SortingEvent, e);
  1555. }
  1556. protected virtual void OnTotalRowCountAvailable (PageEventArgs e)
  1557. {
  1558. InvokeEvent <PageEventArgs> (TotalRowCountAvailableEvent, e);
  1559. }
  1560. protected override void PerformDataBinding (IEnumerable data)
  1561. {
  1562. base.PerformDataBinding (data);
  1563. TrackViewState ();
  1564. if (IsBoundUsingDataSourceID) {
  1565. int editIndex = EditIndex;
  1566. IList <ListViewDataItem> items = Items;
  1567. if (editIndex > 0 && editIndex < items.Count) {
  1568. CurrentEditOldValues.Clear ();
  1569. ExtractItemValues (CurrentEditOldValues, items [editIndex], true);
  1570. }
  1571. }
  1572. int childCount = CreateChildControls (data, true);
  1573. ChildControlsCreated = true;
  1574. ViewState ["_!ItemCount"] = childCount;
  1575. }
  1576. protected override void PerformSelect ()
  1577. {
  1578. EnsureLayoutTemplate ();
  1579. base.PerformSelect ();
  1580. }
  1581. protected virtual void RemoveItems ()
  1582. {
  1583. if (_nonGroupedItemsContainer != null)
  1584. RemoveItems (_nonGroupedItemsContainer, _nonGroupedItemsContainerFirstItemIndex, _nonGroupedItemsContainerItemCount);
  1585. if (_groupedItemsContainer != null)
  1586. RemoveItems (_groupedItemsContainer, _groupedItemsContainerPlaceholderIndex, _groupedItemsContainerItemCount);
  1587. }
  1588. void RemoveItems (Control container, int start, int count)
  1589. {
  1590. int i = count;
  1591. while (i-- > 0)
  1592. container.Controls.RemoveAt (start);
  1593. }
  1594. protected override void Render (HtmlTextWriter writer)
  1595. {
  1596. base.Render (writer);
  1597. // Why override?
  1598. }
  1599. object SaveDataKeysState ()
  1600. {
  1601. DataKeyArray dka = DataKeys;
  1602. int len = dka != null ? dka.Count : 0;
  1603. if (len == 0)
  1604. return null;
  1605. object[] state = new object [len];
  1606. DataKey dk;
  1607. for (int i = 0; i < len; i++) {
  1608. dk = dka [i];
  1609. if (dk == null) {
  1610. state [i] = null;
  1611. continue;
  1612. }
  1613. state [i] = ((IStateManager)dk).SaveViewState ();
  1614. }
  1615. return state;
  1616. }
  1617. protected override object SaveControlState ()
  1618. {
  1619. object[] ret = new object [CSTATE_COUNT];
  1620. string[] dataKeyNames = DataKeyNames;
  1621. object dataKeysState = SaveDataKeysState ();
  1622. ret [CSTATE_BASE_STATE] = base.SaveControlState ();
  1623. ret [CSTATE_DATAKEYNAMES] = dataKeyNames.Length > 0 ? dataKeyNames : null;
  1624. ret [CSTATE_DATAKEYSSTATE] = dataKeysState != null ? dataKeysState : null;
  1625. ret [CSTATE_GROUPITEMCOUNT] = _groupItemCount > 1 ? (object)_groupItemCount : null;
  1626. ret [CSTATE_TOTALROWCOUNT] = _totalRowCount >= 1 ? (object)_totalRowCount : null;
  1627. ret [CSTATE_EDITINDEX] = _editIndex != -1 ? (object)_editIndex : null;
  1628. ret [CSTATE_SELECTEDINDEX] = _selectedIndex != -1 ? (object)_selectedIndex : null;
  1629. ret [CSTATE_SORTDIRECTION] = _sortDirection != SortDirection.Ascending ? (object)_sortDirection : null;
  1630. ret [CSTATE_SORTEXPRESSION] = String.IsNullOrEmpty (_sortExpression) ? null : _sortExpression;
  1631. return ret;
  1632. }
  1633. object SaveCurrentEditOldValues ()
  1634. {
  1635. IOrderedDictionary values = CurrentEditOldValues;
  1636. int count = values.Count;
  1637. if (count == 0)
  1638. return null;
  1639. object[] ret = new object [count];
  1640. DictionaryEntry entry;
  1641. int i = -1;
  1642. foreach (object o in values) {
  1643. i++;
  1644. entry = (DictionaryEntry)o;
  1645. ret [i] = new Pair (entry.Key, entry.Value);
  1646. }
  1647. return ret;
  1648. }
  1649. protected override object SaveViewState ()
  1650. {
  1651. object[] states = new object [2];
  1652. states [0] = base.SaveViewState ();
  1653. states [1] = SaveCurrentEditOldValues ();
  1654. return states;
  1655. }
  1656. protected virtual void SetPageProperties (int startRowIndex, int maximumRows, bool databind)
  1657. {
  1658. if (maximumRows < 1)
  1659. throw new ArgumentOutOfRangeException ("maximumRows");
  1660. if (startRowIndex < 0)
  1661. throw new ArgumentOutOfRangeException ("startRowIndex");
  1662. if (maximumRows != _maximumRows || startRowIndex != _startRowIndex) {
  1663. if (databind) {
  1664. var args = new PagePropertiesChangingEventArgs (startRowIndex, maximumRows);
  1665. OnPagePropertiesChanging (args);
  1666. _startRowIndex = args.StartRowIndex;
  1667. _maximumRows = args.MaximumRows;
  1668. } else {
  1669. _startRowIndex = startRowIndex;
  1670. _maximumRows = maximumRows;
  1671. }
  1672. if (databind)
  1673. OnPagePropertiesChanged (EventArgs.Empty);
  1674. }
  1675. if (databind)
  1676. RequiresDataBinding = true;
  1677. }
  1678. public virtual void Sort (string sortExpression, SortDirection sortDirection)
  1679. {
  1680. ListViewSortEventArgs args = new ListViewSortEventArgs (sortExpression, sortDirection);
  1681. OnSorting (args);
  1682. if (args.Cancel)
  1683. return;
  1684. if (IsBoundUsingDataSourceID) {
  1685. DataSourceView dsv = GetData ();
  1686. if (dsv == null)
  1687. throw new InvalidOperationException ("Missing data.");
  1688. _sortDirection = args.SortDirection;
  1689. _sortExpression = args.SortExpression;
  1690. _startRowIndex = 0;
  1691. EditIndex = -1;
  1692. }
  1693. OnSorted (EventArgs.Empty);
  1694. RequiresDataBinding = true;
  1695. }
  1696. void IPageableItemContainer.SetPageProperties (int startRowIndex, int maximumRows, bool databind)
  1697. {
  1698. SetPageProperties (startRowIndex, maximumRows, databind);
  1699. }
  1700. NotSupportedException StylingNotSupported ()
  1701. {
  1702. return new NotSupportedException ("Style properties are not supported on ListView. Apply styling or CSS classes to the elements in the ListView's templates.");
  1703. }
  1704. }
  1705. }
  1706. #endif