DataList.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. /**
  2. * Namespace: System.Web.UI.WebControls
  3. * Class: DataList
  4. *
  5. * Author: Gaurav Vaish
  6. * Maintainer: [email protected]
  7. * Contact: <[email protected]>, <[email protected]>
  8. * Implementation: yes
  9. * Status: 70%
  10. *
  11. * (C) Gaurav Vaish (2001)
  12. */
  13. using System;
  14. using System.Collections;
  15. using System.ComponentModel;
  16. using System.Web;
  17. using System.Web.UI;
  18. namespace System.Web.UI.WebControls
  19. {
  20. //TODO: [Designer("??")]
  21. //TODO: [Editor("??")]
  22. public class DataList: BaseDataList, INamingContainer, IRepeatInfoUser
  23. {
  24. public const string CancelCommandName = "Cancel";
  25. public const string DeleteCommandName = "Delete";
  26. public const string EditCommandName = "Edit";
  27. public const string SelectCommandName = "Select";
  28. public const string UpdateCommandName = "Update";
  29. private static readonly object CancelCommandEvent = new object();
  30. private static readonly object DeleteCommandEvent = new object();
  31. private static readonly object EditCommandEvent = new object();
  32. private static readonly object ItemCommandEvent = new object();
  33. private static readonly object ItemCreatedEvent = new object();
  34. private static readonly object ItemDataBoundEvent = new object();
  35. private static readonly object UpdateCommandEvent = new object();
  36. private TableItemStyle alternatingItemStyle;
  37. private TableItemStyle editItemStyle;
  38. private TableItemStyle footerStyle;
  39. private TableItemStyle headerStyle;
  40. private TableItemStyle itemStyle;
  41. private TableItemStyle selectedItemStyle;
  42. private TableItemStyle separatorStyle;
  43. private ITemplate alternatingItemTemplate;
  44. private ITemplate editItemTemplate;
  45. private ITemplate footerTemplate;
  46. private ITemplate headerTemplate;
  47. private ITemplate itemTemplate;
  48. private ITemplate selectedItemTemplate;
  49. private ITemplate separatorTemplate;
  50. private ITemplate separatorItemTemplate;
  51. private ArrayList itemsArray;
  52. private DataListItemCollection items;
  53. private bool extractTemplateRows;
  54. public DataList(): base()
  55. {
  56. }
  57. public virtual TableItemStyle AlternatingItemStyle
  58. {
  59. get
  60. {
  61. if(alternatingItemStyle == null)
  62. {
  63. alternatingItemStyle = new TableItemStyle();
  64. if(IsTrackingViewState)
  65. alternatingItemStyle.TrackViewState();
  66. }
  67. return alternatingItemStyle;
  68. }
  69. }
  70. public virtual ITemplate AlternatingItemTemplate
  71. {
  72. get
  73. {
  74. return alternatingItemTemplate;
  75. }
  76. set
  77. {
  78. alternatingItemTemplate = value;
  79. }
  80. }
  81. public virtual int EditItemIndex
  82. {
  83. get
  84. {
  85. object o = ViewState["EditItemIndex"];
  86. if(o != null)
  87. return (int)o;
  88. return -1;
  89. }
  90. set
  91. {
  92. ViewState["EditItemIndex"] = value;
  93. }
  94. }
  95. public virtual TableItemStyle EditItemStyle
  96. {
  97. get
  98. {
  99. if(editItemStyle == null)
  100. {
  101. editItemStyle = new TableItemStyle();
  102. if(IsTrackingViewState)
  103. editItemStyle.TrackViewState();
  104. }
  105. return editItemStyle;
  106. }
  107. }
  108. public virtual ITemplate EditItemTemplate
  109. {
  110. get
  111. {
  112. return editItemTemplate;
  113. }
  114. set
  115. {
  116. editItemTemplate = value;
  117. }
  118. }
  119. public virtual bool ExtractTemplateRows
  120. {
  121. get
  122. {
  123. object o = ViewState["ExtractTemplateRows"];
  124. if(o != null)
  125. return (bool)o;
  126. return false;
  127. }
  128. set
  129. {
  130. ViewState["ExtractTemplateRows"] = value;
  131. }
  132. }
  133. public virtual TableItemStyle FooterStyle
  134. {
  135. get
  136. {
  137. if(footerStyle == null)
  138. {
  139. footerStyle = new TableItemStyle();
  140. if(IsTrackingViewState)
  141. footerStyle.TrackViewState();
  142. }
  143. return footerStyle;
  144. }
  145. }
  146. public virtual ITemplate FooterTemplate
  147. {
  148. get
  149. {
  150. return footerTemplate;
  151. }
  152. set
  153. {
  154. footerTemplate = value;
  155. }
  156. }
  157. public override GridLines GridLines
  158. {
  159. get
  160. {
  161. return GridLines;
  162. }
  163. set
  164. {
  165. GridLines = value;
  166. }
  167. }
  168. public virtual TableItemStyle HeaderStyle
  169. {
  170. get
  171. {
  172. if(headerStyle == null)
  173. {
  174. headerStyle = new TableItemStyle();
  175. if(IsTrackingViewState)
  176. headerStyle.TrackViewState();
  177. }
  178. return headerStyle;
  179. }
  180. }
  181. public virtual ITemplate HeaderTemplate
  182. {
  183. get
  184. {
  185. return headerTemplate;
  186. }
  187. set
  188. {
  189. headerTemplate = value;
  190. }
  191. }
  192. public virtual DataListItemCollection Items
  193. {
  194. get
  195. {
  196. if(items == null)
  197. {
  198. if(itemsArray == null)
  199. {
  200. EnsureChildControls();
  201. itemsArray = new ArrayList();
  202. }
  203. items = new DataListItemCollection(itemsArray);
  204. }
  205. return items;
  206. }
  207. }
  208. public virtual TableItemStyle ItemStyle
  209. {
  210. get
  211. {
  212. if(itemStyle == null)
  213. {
  214. itemStyle = new TableItemStyle();
  215. if(IsTrackingViewState)
  216. itemStyle.TrackViewState();
  217. }
  218. return itemStyle;
  219. }
  220. }
  221. public virtual ITemplate ItemTemplate
  222. {
  223. get
  224. {
  225. return itemTemplate;
  226. }
  227. set
  228. {
  229. itemTemplate = value;
  230. }
  231. }
  232. public virtual int RepeatColumns
  233. {
  234. get
  235. {
  236. object o = ViewState["RepeatColumns"];
  237. if(o != null)
  238. return (int)o;
  239. return 0;
  240. }
  241. set
  242. {
  243. if(value < 0)
  244. throw new ArgumentOutOfRangeException("value");
  245. ViewState["RepeatColumns"] = value;
  246. }
  247. }
  248. public virtual RepeatDirection RepeatDirection
  249. {
  250. get
  251. {
  252. object o = ViewState["RepeatDirection"];
  253. if(o != null)
  254. return (RepeatDirection)o;
  255. return RepeatDirection.Vertical;
  256. }
  257. set
  258. {
  259. if(!Enum.IsDefined(typeof(RepeatDirection), value))
  260. throw new ArgumentException();
  261. ViewState["RepeatDirection"] = value;
  262. }
  263. }
  264. public virtual RepeatLayout RepeatLayout
  265. {
  266. get
  267. {
  268. object o = ViewState["RepeatLayout"];
  269. if(o != null)
  270. return (RepeatLayout)o;
  271. return RepeatLayout.Table;
  272. }
  273. set
  274. {
  275. if(!Enum.IsDefined(typeof(RepeatLayout), value))
  276. throw new ArgumentException();
  277. ViewState["RepeatLayout"] = value;
  278. }
  279. }
  280. public virtual int SelectedIndex
  281. {
  282. get
  283. {
  284. object o = ViewState["SelectedIndex"];
  285. if(o != null)
  286. return (int)o;
  287. return -1;
  288. }
  289. set
  290. {
  291. //FIXME: Looks like a bug in Microsoft's specs.
  292. // Exception is missing in document. I haven't tested the case
  293. // But I think exception should follow
  294. if(value < -1)
  295. throw new ArgumentOutOfRangeException("value");
  296. int prevSel = SelectedIndex;
  297. ViewState["SelectedIndex"] = value;
  298. DataListItem prevSelItem;
  299. ListItemType liType;
  300. if(itemsArray != null)
  301. {
  302. if(prevSel >= 0 && prevSel < itemsArray.Count)
  303. {
  304. prevSelItem = (DataListItem)itemsArray[prevSel];
  305. if(prevSelItem.ItemType != ListItemType.EditItem)
  306. {
  307. liType = ( (prevSel % 2) == 0 ? ListItemType.AlternatingItem : ListItemType.Item );
  308. prevSelItem.SetItemType(liType);
  309. }
  310. }
  311. if(value >= 0 && value < itemsArray.Count)
  312. {
  313. prevSelItem = (DataListItem) itemsArray[value];
  314. if(prevSelItem.ItemType != ListItemType.EditItem)
  315. {
  316. prevSelItem.SetItemType(ListItemType.SelectedItem);
  317. }
  318. }
  319. }
  320. }
  321. }
  322. public virtual DataListItem SelectedItem
  323. {
  324. get
  325. {
  326. if(SelectedIndex == -1)
  327. return null;
  328. return Items[SelectedIndex];
  329. }
  330. }
  331. public virtual TableItemStyle SelectedItemStyle
  332. {
  333. get
  334. {
  335. if(selectedItemStyle == null)
  336. {
  337. selectedItemStyle = new TableItemStyle();
  338. if(IsTrackingViewState)
  339. selectedItemStyle.TrackViewState();
  340. }
  341. return selectedItemStyle;
  342. }
  343. }
  344. public virtual ITemplate SelectedItemTemplate
  345. {
  346. get
  347. {
  348. return selectedItemTemplate;
  349. }
  350. set
  351. {
  352. selectedItemTemplate = value;
  353. }
  354. }
  355. public virtual TableItemStyle SeparatorStyle
  356. {
  357. get
  358. {
  359. if(separatorStyle == null)
  360. {
  361. separatorStyle = new TableItemStyle();
  362. if(IsTrackingViewState)
  363. separatorStyle.TrackViewState();
  364. }
  365. return separatorStyle;
  366. }
  367. }
  368. public virtual ITemplate SeparatorTemplate
  369. {
  370. get
  371. {
  372. return separatorTemplate;
  373. }
  374. set
  375. {
  376. separatorTemplate = value;
  377. }
  378. }
  379. public virtual ITemplate SeparatorItemTemplate
  380. {
  381. get
  382. {
  383. return separatorItemTemplate;
  384. }
  385. set
  386. {
  387. separatorItemTemplate = value;
  388. }
  389. }
  390. public virtual bool ShowHeader
  391. {
  392. get
  393. {
  394. object o = ViewState["ShowHeader"];
  395. if(o!=null)
  396. return (bool)o;
  397. return true;
  398. }
  399. set
  400. {
  401. ViewState["ShowHeader"] = value;
  402. }
  403. }
  404. public virtual bool ShowFooter
  405. {
  406. get
  407. {
  408. object o = ViewState["ShowFooter"];
  409. if(o!=null)
  410. return (bool)o;
  411. return true;
  412. }
  413. set
  414. {
  415. ViewState["ShowFooter"] = value;
  416. }
  417. }
  418. public event DataListCommandEventHandler CancelCommand
  419. {
  420. add
  421. {
  422. Events.AddHandler(CancelCommandEvent, value);
  423. }
  424. remove
  425. {
  426. Events.RemoveHandler(CancelCommandEvent, value);
  427. }
  428. }
  429. public event DataListCommandEventHandler DeleteCommand
  430. {
  431. add
  432. {
  433. Events.AddHandler(DeleteCommandEvent, value);
  434. }
  435. remove
  436. {
  437. Events.RemoveHandler(DeleteCommandEvent, value);
  438. }
  439. }
  440. public event DataListCommandEventHandler EditCommand
  441. {
  442. add
  443. {
  444. Events.AddHandler(EditCommandEvent, value);
  445. }
  446. remove
  447. {
  448. Events.RemoveHandler(EditCommandEvent, value);
  449. }
  450. }
  451. public event DataListCommandEventHandler ItemCommand
  452. {
  453. add
  454. {
  455. Events.AddHandler(ItemCommandEvent, value);
  456. }
  457. remove
  458. {
  459. Events.RemoveHandler(ItemCommandEvent, value);
  460. }
  461. }
  462. public event DataListCommandEventHandler ItemCreated
  463. {
  464. add
  465. {
  466. Events.AddHandler(ItemCreatedEvent, value);
  467. }
  468. remove
  469. {
  470. Events.RemoveHandler(ItemCreatedEvent, value);
  471. }
  472. }
  473. public event DataListCommandEventHandler ItemDataBound
  474. {
  475. add
  476. {
  477. Events.AddHandler(ItemDataBoundEvent, value);
  478. }
  479. remove
  480. {
  481. Events.RemoveHandler(ItemDataBoundEvent, value);
  482. }
  483. }
  484. public event DataListCommandEventHandler UpdateCommand
  485. {
  486. add
  487. {
  488. Events.AddHandler(UpdateCommandEvent, value);
  489. }
  490. remove
  491. {
  492. Events.RemoveHandler(UpdateCommandEvent, value);
  493. }
  494. }
  495. protected override Style CreateControlStyle()
  496. {
  497. TableStyle retVal = new TableStyle(ViewState);
  498. retVal.CellSpacing = 0;
  499. return retVal;
  500. }
  501. protected override void LoadViewState(object savedState)
  502. {
  503. object[] states;
  504. if(savedState != null && (states = (object[])savedState) != null)
  505. {
  506. if(states[0] != null)
  507. LoadViewState(states[0]);
  508. if(states[1] != null)
  509. alternatingItemStyle.LoadViewState(states[1]);
  510. if(states[2] != null)
  511. editItemStyle.LoadViewState(states[2]);
  512. if(states[3] != null)
  513. footerStyle.LoadViewState(states[3]);
  514. if(states[4] != null)
  515. headerStyle.LoadViewState(states[4]);
  516. if(states[5] != null)
  517. itemStyle.LoadViewState(states[5]);
  518. if(states[6] != null)
  519. selectedItemStyle.LoadViewState(states[6]);
  520. if(states[7] != null)
  521. separatorStyle.LoadViewState(states[7]);
  522. }
  523. }
  524. protected override object SaveViewState()
  525. {
  526. object[] states = new object[8];
  527. states[0] = SaveViewState();
  528. states[1] = (alternatingItemStyle == null ? null : alternatingItemStyle.SaveViewState());
  529. states[2] = (editItemStyle == null ? null : editItemStyle.SaveViewState());
  530. states[3] = (footerStyle == null ? null : footerStyle.SaveViewState());
  531. states[4] = (headerStyle == null ? null : headerStyle.SaveViewState());
  532. states[5] = (itemStyle == null ? null : itemStyle.SaveViewState());
  533. states[6] = (selectedItemStyle == null ? null : selectedItemStyle.SaveViewState());
  534. states[7] = (separatorStyle == null ? null : separatorStyle.SaveViewState());
  535. return states;
  536. }
  537. protected override void TrackViewState()
  538. {
  539. TrackViewState();
  540. if(alternatingItemStyle != null)
  541. alternatingItemStyle.TrackViewState();
  542. if(editItemStyle != null)
  543. editItemStyle.TrackViewState();
  544. if(footerStyle != null)
  545. footerStyle.TrackViewState();
  546. if(headerStyle != null)
  547. headerStyle.TrackViewState();
  548. if(itemStyle != null)
  549. itemStyle.TrackViewState();
  550. if(selectedItemStyle != null)
  551. selectedItemStyle.TrackViewState();
  552. if(separatorStyle != null)
  553. separatorStyle.TrackViewState();
  554. }
  555. protected override bool OnBubbleEvent(object source, EventArgs e)
  556. {
  557. bool retVal = false;
  558. if(e is DataListCommandEventArgs)
  559. {
  560. DataListCommandEventArgs dlcea = (DataListCommandEventArgs)e;
  561. OnItemCommand(dlcea);
  562. retVal = true;
  563. if(String.Compare(dlcea.CommandName, "Cancel") == 0)
  564. {
  565. OnCancelCommand(dlcea);
  566. }
  567. if(String.Compare(dlcea.CommandName, "Delete") == 0)
  568. {
  569. OnDeleteCommand(dlcea);
  570. }
  571. if(String.Compare(dlcea.CommandName, "Edit") == 0)
  572. {
  573. OnEditCommand(dlcea);
  574. }
  575. if(String.Compare(dlcea.CommandName, "Select") == 0)
  576. {
  577. SelectedIndex = dlcea.Item.ItemIndex;
  578. OnSelectedIndexChanged(EventArgs.Empty);
  579. }
  580. if(String.Compare(dlcea.CommandName, "Update") == 0)
  581. {
  582. OnUpdateCommand(dlcea);
  583. }
  584. }
  585. return retVal;
  586. }
  587. protected virtual void OnCancelCommand(DataListCommandEventArgs e)
  588. {
  589. if(Events != null)
  590. {
  591. DataListCommandEventHandler dlceh = (DataListCommandEventHandler)(Events[CancelCommandEvent]);
  592. if(dlceh != null)
  593. dlceh(this, e);
  594. }
  595. }
  596. protected virtual void OnDeleteCommand(DataListCommandEventArgs e)
  597. {
  598. if(Events != null)
  599. {
  600. DataListCommandEventHandler dlceh = (DataListCommandEventHandler)(Events[DeleteCommandEvent]);
  601. if(dlceh != null)
  602. dlceh(this, e);
  603. }
  604. }
  605. protected virtual void OnEditCommand(DataListCommandEventArgs e)
  606. {
  607. if(Events != null)
  608. {
  609. DataListCommandEventHandler dlceh = (DataListCommandEventHandler)(Events[EditCommandEvent]);
  610. if(dlceh != null)
  611. dlceh(this, e);
  612. }
  613. }
  614. protected virtual void OnItemCommand(DataListCommandEventArgs e)
  615. {
  616. if(Events != null)
  617. {
  618. DataListCommandEventHandler dlceh = (DataListCommandEventHandler)(Events[ItemCommandEvent]);
  619. if(dlceh != null)
  620. dlceh(this, e);
  621. }
  622. }
  623. protected virtual void OnItemCreated(DataListItemEventArgs e)
  624. {
  625. if(Events != null)
  626. {
  627. DataListItemEventHandler dlceh = (DataListItemEventHandler)(Events[ItemCreatedEvent]);
  628. if(dlceh != null)
  629. dlceh(this, e);
  630. }
  631. }
  632. protected virtual void OnItemDataBound(DataListItemEventArgs e)
  633. {
  634. if(Events != null)
  635. {
  636. DataListItemEventHandler dlceh = (DataListItemEventHandler)(Events[ItemDataBoundEvent]);
  637. if(dlceh != null)
  638. dlceh(this, e);
  639. }
  640. }
  641. protected virtual void OnUpdateCommand(DataListCommandEventArgs e)
  642. {
  643. if(Events != null)
  644. {
  645. DataListCommandEventHandler dlceh = (DataListCommandEventHandler)(Events[UpdateCommandEvent]);
  646. if(dlceh != null)
  647. dlceh(this, e);
  648. }
  649. }
  650. [MonoTODO]
  651. protected override void RenderContents(HtmlTextWriter writer)
  652. {
  653. throw new NotImplementedException();
  654. }
  655. [MonoTODO]
  656. private DataListItem GetItem(ListItemType itemType, int repeatIndex)
  657. {
  658. DataListItem retVal = null;
  659. switch(itemType)
  660. {
  661. case ListItemType.Header: retVal = (DataListItem)Controls[0];
  662. break;
  663. case ListItemType.Footer: retVal = (DataListItem)Controls[Controls.Count - 1];
  664. break;
  665. case ListItemType.Item: goto case ListItemType.EditItem;
  666. case ListItemType.AlternatingItem: goto case ListItemType.EditItem;
  667. case ListItemType.SelectedItem: goto case ListItemType.EditItem;
  668. case ListItemType.EditItem: retVal = (DataListItem)Controls[repeatIndex];
  669. break;
  670. case ListItemType.Separator: int index = 2 * repeatIndex + 1;
  671. if(headerTemplate != null)
  672. index ++;
  673. retVal = (DataListItem)Controls[index];
  674. break;
  675. }
  676. return retVal;
  677. }
  678. /// <summary>
  679. /// Undocumented
  680. /// </summary>
  681. [MonoTODO]
  682. protected override void CreateControlHierarchy(bool create)
  683. {
  684. throw new NotImplementedException();
  685. }
  686. /// <summary>
  687. /// Undocumented
  688. /// </summary>
  689. [MonoTODO]
  690. protected virtual DataListItem CreateItem(int itemIndex, ListItemType itemType)
  691. {
  692. throw new NotImplementedException();
  693. }
  694. [MonoTODO]
  695. private DataListItem CreateItem(int itemIndex, ListItemType itemType, bool dataBind, object dataItem)
  696. {
  697. throw new NotImplementedException();
  698. }
  699. /// <summary>
  700. /// Undocumented
  701. /// </summary>
  702. [MonoTODO]
  703. protected override void PrepareControlHierarchy()
  704. {
  705. throw new NotImplementedException();
  706. }
  707. /// <summary>
  708. /// Undocumented
  709. /// </summary>
  710. [MonoTODO]
  711. protected virtual void InitializeItem(DataListItem item)
  712. {
  713. throw new NotImplementedException();
  714. }
  715. bool IRepeatInfoUser.HasFooter
  716. {
  717. get
  718. {
  719. return !(ShowFooter && footerTemplate!=null);
  720. }
  721. }
  722. bool IRepeatInfoUser.HasHeader
  723. {
  724. get
  725. {
  726. return !(ShowHeader && headerTemplate!=null);
  727. }
  728. }
  729. bool IRepeatInfoUser.HasSeparators
  730. {
  731. get
  732. {
  733. return (separatorItemTemplate!=null);
  734. }
  735. }
  736. int IRepeatInfoUser.RepeatedItemCount
  737. {
  738. get
  739. {
  740. if(itemsArray!=null)
  741. return itemsArray.Count;
  742. return 0;
  743. }
  744. }
  745. void IRepeatInfoUser.RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
  746. {
  747. DataListItem item = GetItem(itemType, repeatIndex);
  748. if(item!=null)
  749. {
  750. item.RenderItem(writer, extractTemplateRows, repeatInfo.RepeatLayout == RepeatLayout.Table);
  751. }
  752. }
  753. Style IRepeatInfoUser.GetItemStyle(ListItemType itemType, int repeatIndex)
  754. {
  755. if(GetItem(itemType, repeatIndex)!=null && ControlStyleCreated)
  756. return ControlStyle;
  757. return null;
  758. }
  759. }
  760. }