ListView.cs 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053
  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. if (RequiresDataBinding)
  661. EnsureDataBound ();
  662. int c = (int)itemCount;
  663. if (c >= 0) {
  664. // Fake data - we only need to make sure
  665. // OnTotalRowCountAvailable is called now - so that any
  666. // pagers can create child controls.
  667. object[] data = new object [c];
  668. CreateChildControls (data, false);
  669. }
  670. }
  671. base.CreateChildControls ();
  672. }
  673. protected virtual int CreateChildControls (IEnumerable dataSource, bool dataBinding)
  674. {
  675. IList <ListViewDataItem> retList = null;
  676. EnsureLayoutTemplate ();
  677. RemoveItems ();
  678. // If any of the _maximumRows or _startRowIndex is different to their
  679. // defaults, it means we are paging - i.e. SetPageProperties has been
  680. // called.
  681. bool haveDataToPage = _maximumRows > 0 || _startRowIndex > 0;
  682. var pagedDataSource = new ListViewPagedDataSource ();
  683. if (dataBinding) {
  684. DataSourceView view = GetData ();
  685. if (view == null)
  686. throw new InvalidOperationException ("dataSource returned a null reference for DataSourceView.");
  687. int totalRowCount = 0;
  688. if (haveDataToPage && view.CanPage) {
  689. if (view.CanRetrieveTotalRowCount)
  690. totalRowCount = SelectArguments.TotalRowCount;
  691. else {
  692. ICollection ds = dataSource as ICollection;
  693. if (ds == null)
  694. throw new InvalidOperationException ("dataSource does not implement the ICollection interface.");
  695. totalRowCount = ds.Count + StartRowIndex;
  696. }
  697. }
  698. pagedDataSource.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. }
  705. pagedDataSource.StartRowIndex = StartRowIndex;
  706. pagedDataSource.MaximumRows = MaximumRows;
  707. pagedDataSource.DataSource = dataSource;
  708. bool emptySet = false;
  709. if (dataSource != null) {
  710. if (GroupItemCount <= 1 && GroupTemplate == null)
  711. retList = CreateItemsWithoutGroups (pagedDataSource, dataBinding, InsertItemPosition, DataKeyArray);
  712. else
  713. retList = CreateItemsInGroups (pagedDataSource, dataBinding, InsertItemPosition, DataKeyArray);
  714. if (retList == null || retList.Count == 0)
  715. emptySet = true;
  716. if (haveDataToPage)
  717. // Data source has paged data for us, so we must use its total row
  718. // count
  719. _totalRowCount = pagedDataSource.DataSourceCount;
  720. else if (!emptySet)
  721. _totalRowCount = retList.Count;
  722. else
  723. _totalRowCount = 0;
  724. OnTotalRowCountAvailable (new PageEventArgs (_startRowIndex, _maximumRows, _totalRowCount));
  725. } else
  726. emptySet = true;
  727. if (emptySet) {
  728. Controls.Clear ();
  729. CreateEmptyDataItem ();
  730. }
  731. if (retList == null)
  732. return 0;
  733. return _totalRowCount;
  734. }
  735. protected override Style CreateControlStyle ()
  736. {
  737. throw StylingNotSupported ();
  738. }
  739. protected virtual ListViewDataItem CreateDataItem (int dataItemIndex, int displayIndex)
  740. {
  741. return new ListViewDataItem (dataItemIndex, displayIndex);
  742. }
  743. protected override DataSourceSelectArguments CreateDataSourceSelectArguments ()
  744. {
  745. DataSourceSelectArguments arg = DataSourceSelectArguments.Empty;
  746. DataSourceView view = GetData();
  747. if (view.CanPage) {
  748. arg.StartRowIndex = _startRowIndex;
  749. if (view.CanRetrieveTotalRowCount) {
  750. arg.RetrieveTotalRowCount = true;
  751. arg.MaximumRows = _maximumRows;
  752. } else
  753. arg.MaximumRows = -1;
  754. }
  755. if (IsBoundUsingDataSourceID && !String.IsNullOrEmpty (_sortExpression)) {
  756. if (_sortDirection == SortDirection.Ascending)
  757. arg.SortExpression = _sortExpression;
  758. else
  759. arg.SortExpression = _sortExpression + " DESC";
  760. }
  761. return arg;
  762. }
  763. protected virtual void CreateEmptyDataItem ()
  764. {
  765. if (_emptyDataTemplate != null) {
  766. ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
  767. InstantiateEmptyDataTemplate (item);
  768. OnItemCreated (new ListViewItemEventArgs (item));
  769. AddControlToContainer (item, this, 0);
  770. }
  771. }
  772. protected virtual ListViewItem CreateEmptyItem ()
  773. {
  774. if (_emptyItemTemplate != null) {
  775. ListViewItem item = CreateItem (ListViewItemType.EmptyItem);
  776. InstantiateEmptyItemTemplate (item);
  777. OnItemCreated (new ListViewItemEventArgs (item));
  778. return item;
  779. }
  780. return null;
  781. }
  782. protected virtual ListViewItem CreateInsertItem ()
  783. {
  784. if (_insertItemTemplate == null)
  785. // .NET throws a different message, but it's incorrect so we'll use
  786. // this one
  787. throw new InvalidOperationException ("The ListView control '" + ID + "' does not have an InsertItemTemplate template specified.");
  788. ListViewItem ret = CreateItem (ListViewItemType.InsertItem);
  789. InstantiateInsertItemTemplate (ret);
  790. OnItemCreated (new ListViewItemEventArgs (ret));
  791. InsertItem = ret;
  792. return ret;
  793. }
  794. protected virtual ListViewItem CreateItem (ListViewItemType itemType)
  795. {
  796. return new ListViewItem (itemType);
  797. }
  798. void InsertSeparatorItem (Control container, int position)
  799. {
  800. Control control = CreateItem (ListViewItemType.DataItem);
  801. InstantiateItemSeparatorTemplate (control);
  802. AddControlToContainer (control, container, position);
  803. }
  804. ListViewDataItem InsertDataItem (object dataItem, Control container, bool dataBinding, ArrayList keyArray, int startIndex, int position, ref int displayIndex)
  805. {
  806. ListViewDataItem lvdi = CreateDataItem (startIndex + displayIndex, displayIndex);
  807. InstantiateItemTemplate (lvdi, displayIndex);
  808. if (dataBinding) {
  809. lvdi.DataItem = dataItem;
  810. OrderedDictionary dict = new OrderedDictionary ();
  811. string[] dataKeyNames = DataKeyNames;
  812. foreach (string s in dataKeyNames)
  813. dict.Add (s, DataBinder.GetPropertyValue (dataItem, s));
  814. DataKey dk = new DataKey (dict, dataKeyNames);
  815. if (keyArray.Count == displayIndex)
  816. keyArray.Add (dk);
  817. else
  818. keyArray [displayIndex] = dk;
  819. }
  820. OnItemCreated (new ListViewItemEventArgs (lvdi));
  821. AddControlToContainer (lvdi, container, position);
  822. if (dataBinding) {
  823. lvdi.DataBind ();
  824. OnItemDataBound (new ListViewItemEventArgs (lvdi));
  825. }
  826. displayIndex++;
  827. return lvdi;
  828. }
  829. protected virtual IList <ListViewDataItem> CreateItemsInGroups (ListViewPagedDataSource dataSource, bool dataBinding, InsertItemPosition insertPosition,
  830. ArrayList keyArray)
  831. {
  832. if (_groupTemplate == null)
  833. return null;
  834. if (_groupedItemsContainer == null)
  835. _groupedItemsContainer = FindPlaceholder (GroupPlaceholderID, this);
  836. if (_groupedItemsContainer == null)
  837. throw NoPlaceholder (true);
  838. Control parent = _groupedItemsContainer.Parent;
  839. int gpos;
  840. if (_groupedItemsContainerPlaceholderIndex == -1) {
  841. gpos = 0;
  842. if (parent != null) {
  843. gpos = parent.Controls.IndexOf (_groupedItemsContainer);
  844. parent.Controls.Remove (_groupedItemsContainer);
  845. _groupedItemsContainer = parent;
  846. if (_groupedItemsContainer != _layoutTemplatePlaceholder)
  847. AddControlToContainer (_groupedItemsContainer, _layoutTemplatePlaceholder, 0);
  848. }
  849. _groupedItemsContainerPlaceholderIndex = gpos;
  850. } else {
  851. gpos = _groupedItemsContainerPlaceholderIndex;
  852. ResetChildNames (_firstIdAfterLayoutTemplate);
  853. }
  854. IList <ListViewDataItem> ret = Items;
  855. ret.Clear ();
  856. int firstItemIndexInGroup = -1;
  857. Control currentGroup = StartNewGroup (false, ref gpos, ref firstItemIndexInGroup);
  858. int groupItemCount = GroupItemCount;
  859. int itemPosInGroup = firstItemIndexInGroup;
  860. int groupItemCounter = groupItemCount;
  861. ListViewItem lvi;
  862. ListViewItem container;
  863. bool needSeparator = false;
  864. bool haveSeparatorTemplate = _itemSeparatorTemplate != null;
  865. if (insertPosition == InsertItemPosition.FirstItem) {
  866. lvi = CreateInsertItem ();
  867. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  868. groupItemCounter--;
  869. needSeparator = true;
  870. }
  871. int displayIndex = 0;
  872. ListViewDataItem lvdi;
  873. int startIndex = dataSource.StartRowIndex;
  874. int dataCount = dataSource.Count;
  875. int numberOfGroups = (dataCount / groupItemCount) + (dataCount % groupItemCount) - 1;
  876. GroupStart groupStart = () => {
  877. if (groupItemCounter <= 0) {
  878. groupItemCounter = groupItemCount;
  879. currentGroup = StartNewGroup (numberOfGroups >= 1, ref gpos, ref firstItemIndexInGroup);
  880. numberOfGroups--;
  881. itemPosInGroup = firstItemIndexInGroup;
  882. _groupedItemsContainerItemCount++;
  883. needSeparator = false;
  884. }
  885. };
  886. foreach (object item in dataSource) {
  887. groupStart ();
  888. if (needSeparator && haveSeparatorTemplate)
  889. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  890. ret.Add (InsertDataItem (item, currentGroup, dataBinding, keyArray, startIndex, itemPosInGroup++, ref displayIndex));
  891. groupItemCounter--;
  892. if (!needSeparator)
  893. needSeparator = true;
  894. }
  895. groupStart ();
  896. if (insertPosition == InsertItemPosition.LastItem) {
  897. if (needSeparator && haveSeparatorTemplate)
  898. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  899. groupStart ();
  900. lvi = CreateInsertItem ();
  901. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  902. groupItemCounter--;
  903. }
  904. if (groupItemCounter > 0 && _emptyItemTemplate != null) {
  905. while (groupItemCounter > 0) {
  906. if (haveSeparatorTemplate)
  907. InsertSeparatorItem (currentGroup, itemPosInGroup++);
  908. lvi = CreateEmptyItem ();
  909. AddControlToContainer (lvi, currentGroup, itemPosInGroup++);
  910. groupItemCounter--;
  911. }
  912. }
  913. return ret;
  914. }
  915. Control StartNewGroup (bool needSeparator, ref int position, ref int firstItemIndexInGroup)
  916. {
  917. Control control = new ListViewContainer ();
  918. InstantiateGroupTemplate (control);
  919. Control placeholder = FindPlaceholder (ItemPlaceholderID, control);
  920. if (placeholder == null)
  921. throw NoPlaceholder (false);
  922. Control parent = placeholder.Parent;
  923. firstItemIndexInGroup = parent.Controls.IndexOf (placeholder);
  924. if (needSeparator) {
  925. Control separator = new Control ();
  926. InstantiateGroupSeparatorTemplate (separator);
  927. if (separator.Controls.Count > 0) {
  928. AddControlToContainer (separator, _groupedItemsContainer, position++);
  929. _groupedItemsContainerItemCount++;
  930. } else
  931. separator = null;
  932. }
  933. parent.Controls.RemoveAt (firstItemIndexInGroup);
  934. AddControlToContainer (control, _groupedItemsContainer, position++);
  935. return parent;
  936. }
  937. protected virtual IList <ListViewDataItem> CreateItemsWithoutGroups (ListViewPagedDataSource dataSource, bool dataBinding, InsertItemPosition insertPosition,
  938. ArrayList keyArray)
  939. {
  940. if (_nonGroupedItemsContainer == null)
  941. _nonGroupedItemsContainer = FindPlaceholder (ItemPlaceholderID, this);
  942. _nonGroupedItemsContainerItemCount = 0;
  943. if (_nonGroupedItemsContainer == null)
  944. throw NoPlaceholder (false);
  945. Control parent = _nonGroupedItemsContainer.Parent;
  946. int ipos;
  947. if (_nonGroupedItemsContainerFirstItemIndex == -1) {
  948. ipos = 0;
  949. if (parent != null) {
  950. ipos = parent.Controls.IndexOf (_nonGroupedItemsContainer);
  951. parent.Controls.Remove (_nonGroupedItemsContainer);
  952. _nonGroupedItemsContainer = parent;
  953. if (_nonGroupedItemsContainer != _layoutTemplatePlaceholder)
  954. AddControlToContainer (_nonGroupedItemsContainer, _layoutTemplatePlaceholder, 0);
  955. }
  956. _nonGroupedItemsContainerFirstItemIndex = ipos;
  957. } else {
  958. ipos = _nonGroupedItemsContainerFirstItemIndex;
  959. ResetChildNames (_firstIdAfterLayoutTemplate);
  960. }
  961. IList <ListViewDataItem> ret = Items;
  962. ret.Clear ();
  963. ListViewItem lvi;
  964. ListViewItem container;
  965. bool needSeparator = false;
  966. if (insertPosition == InsertItemPosition.FirstItem) {
  967. lvi = CreateInsertItem ();
  968. AddControlToContainer (lvi, _nonGroupedItemsContainer, ipos++);
  969. _nonGroupedItemsContainerItemCount++;
  970. needSeparator = true;
  971. }
  972. bool haveSeparatorTemplate = _itemSeparatorTemplate != null;
  973. int displayIndex = 0;
  974. int startIndex = dataSource.StartRowIndex;
  975. foreach (object item in dataSource) {
  976. if (needSeparator && haveSeparatorTemplate) {
  977. InsertSeparatorItem (_nonGroupedItemsContainer, ipos++);
  978. _nonGroupedItemsContainerItemCount++;
  979. }
  980. ret.Add (InsertDataItem (item, _nonGroupedItemsContainer, dataBinding, keyArray, startIndex, ipos++, ref displayIndex));
  981. _nonGroupedItemsContainerItemCount++;
  982. if (!needSeparator)
  983. needSeparator = true;
  984. }
  985. if (insertPosition == InsertItemPosition.LastItem) {
  986. if (needSeparator && haveSeparatorTemplate) {
  987. container = new ListViewItem ();
  988. InstantiateItemSeparatorTemplate (container);
  989. AddControlToContainer (container, _nonGroupedItemsContainer, ipos++);
  990. _nonGroupedItemsContainerItemCount++;
  991. }
  992. lvi = CreateInsertItem ();
  993. AddControlToContainer (lvi, _nonGroupedItemsContainer, ipos++);
  994. _nonGroupedItemsContainerItemCount++;
  995. }
  996. return ret;
  997. }
  998. protected virtual void CreateLayoutTemplate ()
  999. {
  1000. if (_layoutTemplate != null) {
  1001. _layoutTemplatePlaceholder = new Control ();
  1002. _layoutTemplate.InstantiateIn (_layoutTemplatePlaceholder);
  1003. Controls.Add (_layoutTemplatePlaceholder);
  1004. }
  1005. OnLayoutCreated (EventArgs.Empty);
  1006. }
  1007. public virtual void DeleteItem (int itemIndex)
  1008. {
  1009. if (itemIndex < 0)
  1010. throw new InvalidOperationException ("itemIndex is less than 0.");
  1011. IList <ListViewDataItem> items = Items;
  1012. if (itemIndex < items.Count)
  1013. DoDelete (items [itemIndex], itemIndex);
  1014. }
  1015. protected virtual void EnsureLayoutTemplate ()
  1016. {
  1017. if (Controls.Count != 0)
  1018. return;
  1019. CreateLayoutTemplate ();
  1020. _firstIdAfterLayoutTemplate = GetDefaultNumberID ();
  1021. }
  1022. public virtual void ExtractItemValues (IOrderedDictionary itemValues, ListViewItem item, bool includePrimaryKey)
  1023. {
  1024. if (itemValues == null)
  1025. throw new ArgumentNullException ("itemValues");
  1026. IBindableTemplate bt = null;
  1027. if (item.ItemType == ListViewItemType.DataItem) {
  1028. ListViewDataItem dataItem = item as ListViewDataItem;
  1029. if (dataItem == null)
  1030. throw new InvalidOperationException ("item is not a ListViewDataItem object.");
  1031. int displayIndex = dataItem.DisplayIndex;
  1032. if (_editItemTemplate != null && displayIndex == EditIndex)
  1033. bt = (IBindableTemplate) _editItemTemplate;
  1034. else if (_selectedItemTemplate != null && (displayIndex == SelectedIndex))
  1035. bt = (IBindableTemplate) _selectedItemTemplate;
  1036. else if (_alternatingItemTemplate != null && (displayIndex % 2 != 0))
  1037. bt = (IBindableTemplate) _alternatingItemTemplate;
  1038. else
  1039. bt = (IBindableTemplate) _itemTemplate;
  1040. } else if (_insertItemTemplate != null && item.ItemType == ListViewItemType.InsertItem)
  1041. bt = (IBindableTemplate) _insertItemTemplate;
  1042. if (bt == null)
  1043. return;
  1044. IOrderedDictionary values = bt.ExtractValues (item);
  1045. if (values == null || values.Count == 0)
  1046. return;
  1047. string[] keyNames = includePrimaryKey ? null : DataKeyNames;
  1048. bool haveKeyNames = keyNames != null && keyNames.Length > 0;
  1049. object key, value;
  1050. string s;
  1051. bool convertEmptyStringToNull = ConvertEmptyStringToNull;
  1052. foreach (DictionaryEntry de in values) {
  1053. key = de.Key;
  1054. if (includePrimaryKey || (haveKeyNames && Array.IndexOf (keyNames, key) != -1)) {
  1055. value = de.Value;
  1056. if (convertEmptyStringToNull) {
  1057. s = value as string;
  1058. if (s != null && s.Length == 0)
  1059. value = null;
  1060. }
  1061. itemValues [key] = value;
  1062. }
  1063. }
  1064. }
  1065. protected virtual Control FindPlaceholder (string containerID, Control container)
  1066. {
  1067. // .NET doesn't check whether container is null (!)
  1068. if (String.IsNullOrEmpty (containerID))
  1069. return null;
  1070. if (container.ID == containerID)
  1071. return container;
  1072. Control ret = container.FindControl (containerID);
  1073. if (ret != null)
  1074. return ret;
  1075. foreach (Control c in container.Controls) {
  1076. ret = FindPlaceholder (containerID, c);
  1077. if (ret != null)
  1078. return ret;
  1079. }
  1080. return null;
  1081. }
  1082. public virtual void InsertNewItem (bool causesValidation)
  1083. {
  1084. ListViewItem insertItem = InsertItem;
  1085. if (insertItem == null)
  1086. throw new InvalidOperationException ("The ListView control does not have an insert item.");
  1087. if (causesValidation) {
  1088. Page page = Page;
  1089. if (page != null)
  1090. page.Validate ();
  1091. }
  1092. DoInsert (insertItem, causesValidation);
  1093. }
  1094. public virtual void UpdateItem (int itemIndex, bool causesValidation)
  1095. {
  1096. if (itemIndex < 0)
  1097. throw new InvalidOperationException ("itemIndex is less than 0.");
  1098. IList <ListViewDataItem> items = Items;
  1099. if (itemIndex > items.Count)
  1100. return;
  1101. if (causesValidation) {
  1102. Page page = Page;
  1103. if (page != null)
  1104. page.Validate ();
  1105. }
  1106. DoUpdate (items [itemIndex], itemIndex, causesValidation);
  1107. }
  1108. protected virtual void InstantiateEmptyDataTemplate (Control container)
  1109. {
  1110. if (_emptyDataTemplate != null)
  1111. _emptyDataTemplate.InstantiateIn (container);
  1112. }
  1113. protected virtual void InstantiateEmptyItemTemplate (Control container)
  1114. {
  1115. if (_emptyItemTemplate != null)
  1116. _emptyItemTemplate.InstantiateIn (container);
  1117. }
  1118. protected virtual void InstantiateGroupSeparatorTemplate (Control container)
  1119. {
  1120. if (_groupSeparatorTemplate != null)
  1121. _groupSeparatorTemplate.InstantiateIn (container);
  1122. }
  1123. protected virtual void InstantiateGroupTemplate (Control container)
  1124. {
  1125. if (_groupTemplate != null)
  1126. _groupTemplate.InstantiateIn (container);
  1127. }
  1128. protected virtual void InstantiateInsertItemTemplate (Control container)
  1129. {
  1130. if (_insertItemTemplate != null)
  1131. _insertItemTemplate.InstantiateIn (container);
  1132. }
  1133. protected virtual void InstantiateItemSeparatorTemplate (Control container)
  1134. {
  1135. if (_itemSeparatorTemplate != null)
  1136. _itemSeparatorTemplate.InstantiateIn (container);
  1137. }
  1138. protected virtual void InstantiateItemTemplate (Control container, int displayIndex)
  1139. {
  1140. if (_itemTemplate == null)
  1141. throw new InvalidOperationException ("ItemTemplate is missing");
  1142. ITemplate template = _itemTemplate;
  1143. if (_alternatingItemTemplate != null && (displayIndex % 2 != 0))
  1144. template = _alternatingItemTemplate;
  1145. if (_selectedItemTemplate != null && (displayIndex == _selectedIndex))
  1146. template = _selectedItemTemplate;
  1147. if (_editItemTemplate != null && (displayIndex == _editIndex))
  1148. template = _editItemTemplate;
  1149. template.InstantiateIn (container);
  1150. }
  1151. void LoadDataKeysState (object savedState)
  1152. {
  1153. object[] state = savedState as object[];
  1154. int len = state != null ? state.Length : 0;
  1155. if (len == 0)
  1156. return;
  1157. ArrayList dataKeyArray = DataKeyArray;
  1158. DataKey dk;
  1159. string[] keyNames = DataKeyNames;
  1160. for (int i = 0; i < len; i++) {
  1161. dk = new DataKey (new OrderedDictionary (), keyNames);
  1162. ((IStateManager)dk).LoadViewState (state [i]);
  1163. dataKeyArray.Add (dk);
  1164. }
  1165. _dataKeys = null;
  1166. }
  1167. protected override void LoadControlState (object savedState)
  1168. {
  1169. ResetDefaults ();
  1170. object[] state = savedState as object[];
  1171. if (state == null || state.Length != CSTATE_COUNT)
  1172. return;
  1173. object o;
  1174. base.LoadControlState (state [CSTATE_BASE_STATE]);
  1175. if ((o = state [CSTATE_DATAKEYNAMES]) != null)
  1176. DataKeyNames = (string[])o;
  1177. LoadDataKeysState (state [CSTATE_DATAKEYSSTATE]);
  1178. if ((o = state [CSTATE_GROUPITEMCOUNT]) != null)
  1179. GroupItemCount = (int)o;
  1180. if ((o = state [CSTATE_TOTALROWCOUNT]) != null)
  1181. _totalRowCount = (int)o;
  1182. if ((o = state [CSTATE_EDITINDEX]) != null)
  1183. EditIndex = (int)o;
  1184. if ((o = state [CSTATE_SELECTEDINDEX]) != null)
  1185. SelectedIndex = (int)o;
  1186. if ((o = state [CSTATE_SORTDIRECTION]) != null)
  1187. _sortDirection = (SortDirection)o;
  1188. if ((o = state [CSTATE_SORTEXPRESSION]) != null)
  1189. _sortExpression = (string)o;
  1190. }
  1191. protected override void LoadViewState (object savedState)
  1192. {
  1193. object[] state = savedState as object[];
  1194. int len = state != null ? state.Length : 0;
  1195. if (len == 0)
  1196. return;
  1197. base.LoadViewState (state [0]);
  1198. object[] values = state [0] as object[];
  1199. if (values == null || values.Length == 0)
  1200. return;
  1201. Pair pair;
  1202. IOrderedDictionary currentEditOldValues = CurrentEditOldValues;
  1203. currentEditOldValues.Clear ();
  1204. foreach (object value in values) {
  1205. pair = value as Pair;
  1206. if (pair == null)
  1207. continue;
  1208. currentEditOldValues.Add (pair.First, pair.Second);
  1209. }
  1210. }
  1211. protected override bool OnBubbleEvent (object source, EventArgs e)
  1212. {
  1213. ListViewCommandEventArgs args = e as ListViewCommandEventArgs;
  1214. if (args == null)
  1215. args = new ListViewCommandEventArgs (CreateItem (ListViewItemType.EmptyItem), source, e as CommandEventArgs);
  1216. if (args != null) {
  1217. bool causesValidation = false;
  1218. IButtonControl button = args.CommandSource as IButtonControl;
  1219. if (button != null && button.CausesValidation) {
  1220. Page.Validate (button.ValidationGroup);
  1221. causesValidation = true;
  1222. }
  1223. ProcessCommand (args, causesValidation);
  1224. return true;
  1225. }
  1226. return base.OnBubbleEvent (source, e);
  1227. }
  1228. void ProcessCommand (ListViewCommandEventArgs args, bool causesValidation)
  1229. {
  1230. OnItemCommand (args);
  1231. string commandName = args.CommandName;
  1232. string commandArgument = args.CommandArgument as string;
  1233. if (String.Compare (commandName, DataControlCommands.SortCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1234. Sort (commandArgument, DetermineSortDirection (commandArgument));
  1235. else if (String.Compare (commandName, DataControlCommands.EditCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1236. DoEdit (args);
  1237. else if (String.Compare (commandName, DataControlCommands.CancelCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1238. DoCancel (args);
  1239. else if (String.Compare (commandName, DataControlCommands.DeleteCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1240. DoDelete (args);
  1241. else if (String.Compare (commandName, DataControlCommands.InsertCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1242. DoInsert (args, causesValidation);
  1243. else if (String.Compare (commandName, DataControlCommands.SelectCommandName, StringComparison.OrdinalIgnoreCase) == 0)
  1244. DoSelect (args);
  1245. else if (String.Compare (commandName, DataControlCommands.UpdateCommandName, StringComparison.OrdinalIgnoreCase) == 0) {
  1246. if (causesValidation) {
  1247. Page page = Page;
  1248. if (page != null && !page.IsValid)
  1249. return;
  1250. }
  1251. DoUpdate (args, causesValidation);
  1252. }
  1253. }
  1254. int GetItemIndex (ListViewDataItem item)
  1255. {
  1256. if (item == null)
  1257. return -1;
  1258. int index = item.DisplayIndex;
  1259. if (index < 0)
  1260. return -1;
  1261. return index;
  1262. }
  1263. void DoSelect (ListViewCommandEventArgs args)
  1264. {
  1265. ListViewDataItem item = args.Item as ListViewDataItem;
  1266. int index = GetItemIndex (item);
  1267. if (index < 0)
  1268. return;
  1269. var selectingArgs = new ListViewSelectEventArgs (index);
  1270. OnSelectedIndexChanging (selectingArgs);
  1271. if (selectingArgs.Cancel)
  1272. return;
  1273. SelectedIndex = selectingArgs.NewSelectedIndex;
  1274. OnSelectedIndexChanged (EventArgs.Empty);
  1275. }
  1276. void DoInsert (ListViewCommandEventArgs args, bool causesValidation)
  1277. {
  1278. ListViewItem item = args.Item as ListViewItem;
  1279. if (item == null)
  1280. return;
  1281. DoInsert (item, causesValidation);
  1282. }
  1283. void DoInsert (ListViewItem item, bool causesValidation)
  1284. {
  1285. if (causesValidation) {
  1286. Page page = Page;
  1287. if (page != null && !page.IsValid)
  1288. return;
  1289. }
  1290. DataSourceView view;
  1291. ListViewInsertEventArgs insertingArgs;
  1292. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1293. if (usingDataSourceID) {
  1294. view = GetData ();
  1295. if (view == null)
  1296. throw NoDataSourceView ();
  1297. insertingArgs = new ListViewInsertEventArgs (item);
  1298. ExtractItemValues (insertingArgs.Values, item, true);
  1299. } else {
  1300. view = null;
  1301. insertingArgs = new ListViewInsertEventArgs (item);
  1302. }
  1303. OnItemInserting (insertingArgs);
  1304. if (!usingDataSourceID || insertingArgs.Cancel)
  1305. return;
  1306. _lastInsertValues = insertingArgs.Values;
  1307. view.Insert (_lastInsertValues, DoInsertCallback);
  1308. }
  1309. bool DoInsertCallback (int recordsAffected, Exception ex)
  1310. {
  1311. var insertedArgs = new ListViewInsertedEventArgs (recordsAffected, ex, _lastInsertValues);
  1312. OnItemInserted (insertedArgs);
  1313. _lastInsertValues = null;
  1314. // This will effectively reset the insert values
  1315. if (!insertedArgs.KeepInInsertMode)
  1316. RequiresDataBinding = true;
  1317. return insertedArgs.ExceptionHandled;
  1318. }
  1319. static InvalidOperationException NoDataSourceView ()
  1320. {
  1321. return new InvalidOperationException ("DataSourceView associated with the ListView is null.");
  1322. }
  1323. InvalidOperationException NoPlaceholder (bool group)
  1324. {
  1325. return new InvalidOperationException (
  1326. 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\".",
  1327. group ? "" : "n",
  1328. group ? "group" : "item",
  1329. ID,
  1330. group ? GroupPlaceholderID : ItemPlaceholderID));
  1331. }
  1332. void DoDelete (ListViewCommandEventArgs args)
  1333. {
  1334. ListViewDataItem item = args.Item as ListViewDataItem;
  1335. int index = GetItemIndex (item);
  1336. if (index < 0)
  1337. return;
  1338. DoDelete (item, index);
  1339. }
  1340. void DoDelete (ListViewDataItem item, int index)
  1341. {
  1342. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1343. var deletingArgs = new ListViewDeleteEventArgs (index);
  1344. if (usingDataSourceID) {
  1345. DataKeyArray dka = DataKeys;
  1346. if (index < dka.Count)
  1347. dka [index].Values.CopyTo (deletingArgs.Keys);
  1348. ExtractItemValues (deletingArgs.Values, item, true);
  1349. }
  1350. OnItemDeleting (deletingArgs);
  1351. if (!usingDataSourceID || deletingArgs.Cancel)
  1352. return;
  1353. DataSourceView view = GetData ();
  1354. if (view == null)
  1355. throw NoDataSourceView ();
  1356. _currentDeletingItemKeys = deletingArgs.Keys;
  1357. _currentDeletingItemValues = deletingArgs.Values;
  1358. view.Delete (_currentDeletingItemKeys, _currentDeletingItemValues, DoDeleteCallback);
  1359. }
  1360. bool DoDeleteCallback (int affectedRows, Exception exception)
  1361. {
  1362. var args = new ListViewDeletedEventArgs (affectedRows, exception, _currentDeletingItemKeys, _currentDeletingItemValues);
  1363. OnItemDeleted (args);
  1364. EditIndex = -1;
  1365. RequiresDataBinding = true;
  1366. return args.ExceptionHandled;
  1367. }
  1368. void DoUpdate (ListViewCommandEventArgs args, bool causesValidation)
  1369. {
  1370. ListViewDataItem item = args.Item as ListViewDataItem;
  1371. int index = GetItemIndex (item);
  1372. if (index < 0)
  1373. return;
  1374. DoUpdate (item, index, causesValidation);
  1375. }
  1376. void DoUpdate (ListViewDataItem item, int index, bool causesValidation)
  1377. {
  1378. if (causesValidation) {
  1379. Page page = Page;
  1380. if (page != null && !page.IsValid)
  1381. return;
  1382. }
  1383. bool usingDataSourceID = IsBoundUsingDataSourceID;
  1384. var updatingArgs = new ListViewUpdateEventArgs (index);
  1385. if (usingDataSourceID) {
  1386. DataKeyArray dka = DataKeys;
  1387. if (index < dka.Count)
  1388. dka [index].Values.CopyTo (updatingArgs.Keys);
  1389. CurrentEditOldValues.CopyTo (updatingArgs.OldValues);
  1390. ExtractItemValues (updatingArgs.NewValues, item, true);
  1391. }
  1392. OnItemUpdating (updatingArgs);
  1393. if (!usingDataSourceID || updatingArgs.Cancel)
  1394. return;
  1395. DataSourceView view = GetData ();
  1396. if (view == null)
  1397. throw NoDataSourceView ();
  1398. _currentEditOldValues = updatingArgs.OldValues;
  1399. _currentEditNewValues = updatingArgs.NewValues;
  1400. view.Update (updatingArgs.Keys, _currentEditNewValues, _currentEditOldValues, DoUpdateCallback);
  1401. }
  1402. bool DoUpdateCallback (int affectedRows, Exception exception)
  1403. {
  1404. var args = new ListViewUpdatedEventArgs (affectedRows, exception, _currentEditNewValues, _currentEditOldValues);
  1405. OnItemUpdated (args);
  1406. if (!args.KeepInEditMode) {
  1407. EditIndex = -1;
  1408. RequiresDataBinding = true;
  1409. _currentEditOldValues = null;
  1410. _currentEditNewValues = null;
  1411. }
  1412. return args.ExceptionHandled;
  1413. }
  1414. void DoCancel (ListViewCommandEventArgs args)
  1415. {
  1416. ListViewDataItem item = args.Item as ListViewDataItem;
  1417. int index = GetItemIndex (item);
  1418. if (index < 0)
  1419. return;
  1420. ListViewCancelMode cancelMode;
  1421. if (index == EditIndex)
  1422. cancelMode = ListViewCancelMode.CancelingEdit;
  1423. else if (item.ItemType == ListViewItemType.InsertItem)
  1424. cancelMode = ListViewCancelMode.CancelingInsert;
  1425. else
  1426. throw new InvalidOperationException ("Item being cancelled is neither an edit item or insert item.");
  1427. var cancelArgs = new ListViewCancelEventArgs (index, cancelMode);
  1428. OnItemCanceling (cancelArgs);
  1429. if (cancelArgs.Cancel)
  1430. return;
  1431. if (cancelMode == ListViewCancelMode.CancelingEdit)
  1432. EditIndex = -1;
  1433. RequiresDataBinding = true;
  1434. }
  1435. void DoEdit (ListViewCommandEventArgs args)
  1436. {
  1437. int index = GetItemIndex (args.Item as ListViewDataItem);
  1438. if (index < 0)
  1439. return;
  1440. var editArgs = new ListViewEditEventArgs (index);
  1441. OnItemEditing (editArgs);
  1442. if (editArgs.Cancel)
  1443. return;
  1444. if (IsBoundUsingDataSourceID)
  1445. EditIndex = index;
  1446. RequiresDataBinding = true;
  1447. }
  1448. SortDirection DetermineSortDirection (string sortExpression)
  1449. {
  1450. SortDirection ret;
  1451. if (sortExpression != SortExpression)
  1452. return SortDirection.Ascending;
  1453. if (SortDirection == SortDirection.Ascending)
  1454. ret = SortDirection.Descending;
  1455. else
  1456. ret = SortDirection.Ascending;
  1457. return ret;
  1458. }
  1459. protected override void OnInit (EventArgs e)
  1460. {
  1461. Page.RegisterRequiresControlState (this);
  1462. base.OnInit (e);
  1463. }
  1464. void InvokeEvent <T> (object key, T args) where T : EventArgs
  1465. {
  1466. EventHandlerList events = Events;
  1467. if (events != null) {
  1468. EventHandler <T> eh = events [key] as EventHandler <T>;
  1469. if (eh != null)
  1470. eh (this, args);
  1471. }
  1472. }
  1473. void InvokeEvent (object key, EventArgs args)
  1474. {
  1475. EventHandlerList events = Events;
  1476. if (events != null) {
  1477. EventHandler eh = events [key] as EventHandler;
  1478. if (eh != null)
  1479. eh (this, args);
  1480. }
  1481. }
  1482. protected virtual void OnItemCanceling (ListViewCancelEventArgs e)
  1483. {
  1484. InvokeEvent <ListViewCancelEventArgs> (ItemCancellingEvent, e);
  1485. }
  1486. protected virtual void OnItemCommand (ListViewCommandEventArgs e)
  1487. {
  1488. InvokeEvent <ListViewCommandEventArgs> (ItemCommandEvent, e);
  1489. }
  1490. protected virtual void OnItemCreated (ListViewItemEventArgs e)
  1491. {
  1492. InvokeEvent <ListViewItemEventArgs> (ItemCreatedEvent, e);
  1493. }
  1494. protected virtual void OnItemDataBound (ListViewItemEventArgs e)
  1495. {
  1496. InvokeEvent <ListViewItemEventArgs> (ItemDataBoundEvent, e);
  1497. }
  1498. protected virtual void OnItemDeleted (ListViewDeletedEventArgs e)
  1499. {
  1500. InvokeEvent <ListViewDeletedEventArgs> (ItemDeletedEvent, e);
  1501. }
  1502. protected virtual void OnItemDeleting (ListViewDeleteEventArgs e)
  1503. {
  1504. InvokeEvent <ListViewDeleteEventArgs> (ItemDeletingEvent, e);
  1505. }
  1506. protected virtual void OnItemEditing (ListViewEditEventArgs e)
  1507. {
  1508. InvokeEvent <ListViewEditEventArgs> (ItemEditingEvent, e);
  1509. }
  1510. protected virtual void OnItemInserted (ListViewInsertedEventArgs e)
  1511. {
  1512. InvokeEvent <ListViewInsertedEventArgs> (ItemInsertedEvent, e);
  1513. }
  1514. protected virtual void OnItemInserting (ListViewInsertEventArgs e)
  1515. {
  1516. InvokeEvent <ListViewInsertEventArgs> (ItemInsertingEvent, e);
  1517. }
  1518. protected virtual void OnItemUpdated (ListViewUpdatedEventArgs e)
  1519. {
  1520. InvokeEvent <ListViewUpdatedEventArgs> (ItemUpdatedEvent, e);
  1521. }
  1522. protected virtual void OnItemUpdating (ListViewUpdateEventArgs e)
  1523. {
  1524. InvokeEvent <ListViewUpdateEventArgs> (ItemUpdatingEvent, e);
  1525. }
  1526. protected virtual void OnLayoutCreated (EventArgs e)
  1527. {
  1528. InvokeEvent (LayoutCreatedEvent, e);
  1529. }
  1530. protected virtual void OnPagePropertiesChanged (EventArgs e)
  1531. {
  1532. InvokeEvent (PagePropertiesChangedEvent, e);
  1533. }
  1534. protected virtual void OnPagePropertiesChanging (PagePropertiesChangingEventArgs e)
  1535. {
  1536. InvokeEvent (PagePropertiesChangingEvent, e);
  1537. }
  1538. protected virtual void OnSelectedIndexChanged (EventArgs e)
  1539. {
  1540. InvokeEvent (SelectedIndexChangedEvent, e);
  1541. }
  1542. protected virtual void OnSelectedIndexChanging (ListViewSelectEventArgs e)
  1543. {
  1544. InvokeEvent (SelectedIndexChangingEvent, e);
  1545. }
  1546. protected virtual void OnSorted (EventArgs e)
  1547. {
  1548. InvokeEvent (SortedEvent, e);
  1549. }
  1550. protected virtual void OnSorting (ListViewSortEventArgs e)
  1551. {
  1552. InvokeEvent <ListViewSortEventArgs> (SortingEvent, e);
  1553. }
  1554. protected virtual void OnTotalRowCountAvailable (PageEventArgs e)
  1555. {
  1556. InvokeEvent <PageEventArgs> (TotalRowCountAvailableEvent, e);
  1557. }
  1558. protected override void PerformDataBinding (IEnumerable data)
  1559. {
  1560. base.PerformDataBinding (data);
  1561. TrackViewState ();
  1562. if (IsBoundUsingDataSourceID) {
  1563. int editIndex = EditIndex;
  1564. IList <ListViewDataItem> items = Items;
  1565. if (editIndex > 0 && editIndex < items.Count) {
  1566. CurrentEditOldValues.Clear ();
  1567. ExtractItemValues (CurrentEditOldValues, items [editIndex], true);
  1568. }
  1569. }
  1570. int childCount = CreateChildControls (data, true);
  1571. ChildControlsCreated = true;
  1572. ViewState ["_!ItemCount"] = childCount;
  1573. }
  1574. protected override void PerformSelect ()
  1575. {
  1576. EnsureLayoutTemplate ();
  1577. base.PerformSelect ();
  1578. }
  1579. protected virtual void RemoveItems ()
  1580. {
  1581. if (_nonGroupedItemsContainer != null)
  1582. RemoveItems (_nonGroupedItemsContainer, _nonGroupedItemsContainerFirstItemIndex, _nonGroupedItemsContainerItemCount);
  1583. if (_groupedItemsContainer != null)
  1584. RemoveItems (_groupedItemsContainer, _groupedItemsContainerPlaceholderIndex, _groupedItemsContainerItemCount);
  1585. }
  1586. void RemoveItems (Control container, int start, int count)
  1587. {
  1588. int i = count;
  1589. while (i-- > 0)
  1590. container.Controls.RemoveAt (start);
  1591. }
  1592. protected override void Render (HtmlTextWriter writer)
  1593. {
  1594. base.Render (writer);
  1595. // Why override?
  1596. }
  1597. object SaveDataKeysState ()
  1598. {
  1599. DataKeyArray dka = DataKeys;
  1600. int len = dka != null ? dka.Count : 0;
  1601. if (len == 0)
  1602. return null;
  1603. object[] state = new object [len];
  1604. DataKey dk;
  1605. for (int i = 0; i < len; i++) {
  1606. dk = dka [i];
  1607. if (dk == null) {
  1608. state [i] = null;
  1609. continue;
  1610. }
  1611. state [i] = ((IStateManager)dk).SaveViewState ();
  1612. }
  1613. return state;
  1614. }
  1615. protected override object SaveControlState ()
  1616. {
  1617. object[] ret = new object [CSTATE_COUNT];
  1618. string[] dataKeyNames = DataKeyNames;
  1619. object dataKeysState = SaveDataKeysState ();
  1620. ret [CSTATE_BASE_STATE] = base.SaveControlState ();
  1621. ret [CSTATE_DATAKEYNAMES] = dataKeyNames.Length > 0 ? dataKeyNames : null;
  1622. ret [CSTATE_DATAKEYSSTATE] = dataKeysState != null ? dataKeysState : null;
  1623. ret [CSTATE_GROUPITEMCOUNT] = _groupItemCount > 1 ? (object)_groupItemCount : null;
  1624. ret [CSTATE_TOTALROWCOUNT] = _totalRowCount >= 1 ? (object)_totalRowCount : null;
  1625. ret [CSTATE_EDITINDEX] = _editIndex != -1 ? (object)_editIndex : null;
  1626. ret [CSTATE_SELECTEDINDEX] = _selectedIndex != -1 ? (object)_selectedIndex : null;
  1627. ret [CSTATE_SORTDIRECTION] = _sortDirection != SortDirection.Ascending ? (object)_sortDirection : null;
  1628. ret [CSTATE_SORTEXPRESSION] = String.IsNullOrEmpty (_sortExpression) ? null : _sortExpression;
  1629. return ret;
  1630. }
  1631. object SaveCurrentEditOldValues ()
  1632. {
  1633. IOrderedDictionary values = CurrentEditOldValues;
  1634. int count = values.Count;
  1635. if (count == 0)
  1636. return null;
  1637. object[] ret = new object [count];
  1638. DictionaryEntry entry;
  1639. int i = -1;
  1640. foreach (object o in values) {
  1641. i++;
  1642. entry = (DictionaryEntry)o;
  1643. ret [i] = new Pair (entry.Key, entry.Value);
  1644. }
  1645. return ret;
  1646. }
  1647. protected override object SaveViewState ()
  1648. {
  1649. object[] states = new object [2];
  1650. states [0] = base.SaveViewState ();
  1651. states [1] = SaveCurrentEditOldValues ();
  1652. return states;
  1653. }
  1654. protected virtual void SetPageProperties (int startRowIndex, int maximumRows, bool databind)
  1655. {
  1656. if (maximumRows < 1)
  1657. throw new ArgumentOutOfRangeException ("maximumRows");
  1658. if (startRowIndex < 0)
  1659. throw new ArgumentOutOfRangeException ("startRowIndex");
  1660. if (maximumRows != _maximumRows || startRowIndex != _startRowIndex) {
  1661. if (databind) {
  1662. var args = new PagePropertiesChangingEventArgs (maximumRows, startRowIndex);
  1663. OnPagePropertiesChanging (args);
  1664. }
  1665. _startRowIndex = startRowIndex;
  1666. _maximumRows = maximumRows;
  1667. if (databind)
  1668. OnPagePropertiesChanged (EventArgs.Empty);
  1669. }
  1670. if (databind)
  1671. RequiresDataBinding = true;
  1672. }
  1673. public virtual void Sort (string sortExpression, SortDirection sortDirection)
  1674. {
  1675. ListViewSortEventArgs args = new ListViewSortEventArgs (sortExpression, sortDirection);
  1676. OnSorting (args);
  1677. if (args.Cancel)
  1678. return;
  1679. if (IsBoundUsingDataSourceID) {
  1680. DataSourceView dsv = GetData ();
  1681. if (dsv == null)
  1682. throw new InvalidOperationException ("Missing data.");
  1683. _sortDirection = args.SortDirection;
  1684. _sortExpression = args.SortExpression;
  1685. _startRowIndex = 0;
  1686. EditIndex = -1;
  1687. }
  1688. OnSorted (EventArgs.Empty);
  1689. RequiresDataBinding = true;
  1690. }
  1691. void IPageableItemContainer.SetPageProperties (int startRowIndex, int maximumRows, bool databind)
  1692. {
  1693. SetPageProperties (startRowIndex, maximumRows, databind);
  1694. }
  1695. NotSupportedException StylingNotSupported ()
  1696. {
  1697. return new NotSupportedException ("Style properties are not supported on ListView. Apply styling or CSS classes to the elements in the ListView's templates.");
  1698. }
  1699. }
  1700. }
  1701. #endif