DataList.cs 18 KB

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