DataList.cs 18 KB

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