DataList.cs 18 KB

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