ListView.cs 60 KB

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