//
// System.Web.UI.WebControls.DataList.cs
//
// Authors:
// Gaurav Vaish (gvaish@iitk.ac.in)
// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
//
// (C) Gaurav Vaish (2002)
// (C) 2003 Andreas Nahr
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Web;
using System.Web.UI;
using System.Web.Util;
namespace System.Web.UI.WebControls
{
#if NET_2_0
[ControlValueProperty ("SelectedValue")]
#endif
[Designer("System.Web.UI.Design.WebControls.DataListDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
[Editor ("System.Web.UI.Design.WebControls.DataListComponentEditor, " + Consts.AssemblySystem_Design, typeof (ComponentEditor))]
public class DataList: BaseDataList, INamingContainer, IRepeatInfoUser
{
public const string CancelCommandName = "Cancel";
public const string DeleteCommandName = "Delete";
public const string EditCommandName = "Edit";
public const string SelectCommandName = "Select";
public const string UpdateCommandName = "Update";
static readonly object CancelCommandEvent = new object ();
static readonly object DeleteCommandEvent = new object ();
static readonly object EditCommandEvent = new object ();
static readonly object ItemCommandEvent = new object ();
static readonly object ItemCreatedEvent = new object ();
static readonly object ItemDataBoundEvent = new object ();
static readonly object UpdateCommandEvent = new object ();
TableItemStyle alternatingItemStyle;
TableItemStyle editItemStyle;
TableItemStyle footerStyle;
TableItemStyle headerStyle;
TableItemStyle itemStyle;
TableItemStyle selectedItemStyle;
TableItemStyle separatorStyle;
ITemplate alternatingItemTemplate;
ITemplate editItemTemplate;
ITemplate footerTemplate;
ITemplate headerTemplate;
ITemplate itemTemplate;
ITemplate selectedItemTemplate;
ITemplate separatorTemplate;
ArrayList itemsArray;
DataListItemCollection items;
bool extractTemplateRows;
#if NET_2_0
int selectedIndex = -1;
#endif
public DataList ()
{
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to alternating items.")]
public virtual TableItemStyle AlternatingItemStyle {
get {
if (alternatingItemStyle == null) {
alternatingItemStyle = new TableItemStyle ();
if (IsTrackingViewState)
alternatingItemStyle.TrackViewState ();
}
return alternatingItemStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for alternating items.")]
public virtual ITemplate AlternatingItemTemplate {
get { return alternatingItemTemplate; }
set { alternatingItemTemplate = value; }
}
[DefaultValue (-1)]
[WebCategory ("Misc")]
[WebSysDescription ("The index of the item shown in edit mode.")]
public virtual int EditItemIndex {
get {
object o = ViewState ["EditItemIndex"];
if (o != null)
return (int) o;
return -1;
}
set {
if (value < -1)
throw new ArgumentOutOfRangeException("value");
ViewState ["EditItemIndex"] = value;
}
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to items in edit mode.")]
public virtual TableItemStyle EditItemStyle {
get {
if (editItemStyle == null) {
editItemStyle = new TableItemStyle ();
if (IsTrackingViewState)
editItemStyle.TrackViewState ();
}
return editItemStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for items in edit mode.")]
public virtual ITemplate EditItemTemplate {
get { return editItemTemplate; }
set { editItemTemplate = value; }
}
[DefaultValue (false), WebCategory ("Misc")]
[WebSysDescription ("Extract rows in the template.")]
public virtual bool ExtractTemplateRows {
get {
object o = ViewState ["ExtractTemplateRows"];
if (o != null)
return (bool) o;
return false;
}
set { ViewState ["ExtractTemplateRows"] = value; }
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to the footer.")]
public virtual TableItemStyle FooterStyle {
get {
if (footerStyle == null) {
footerStyle = new TableItemStyle ();
if (IsTrackingViewState)
footerStyle.TrackViewState ();
}
return footerStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for the footer.")]
public virtual ITemplate FooterTemplate {
get { return footerTemplate; }
set { footerTemplate = value; }
}
[DefaultValue (GridLines.None)]
public override GridLines GridLines {
get {
if (ControlStyleCreated)
return base.GridLines;
return GridLines.None;
}
set { base.GridLines = value; }
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to the header.")]
public virtual TableItemStyle HeaderStyle {
get {
if (headerStyle == null) {
headerStyle = new TableItemStyle ();
if (IsTrackingViewState)
headerStyle.TrackViewState ();
}
return headerStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for the header.")]
public virtual ITemplate HeaderTemplate {
get { return headerTemplate; }
set { headerTemplate = value; }
}
[Browsable (false)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[WebSysDescription ("A colletion containing all items.")]
public virtual DataListItemCollection Items {
get {
if (items == null) {
if (itemsArray == null) {
EnsureChildControls ();
itemsArray = new ArrayList ();
}
items = new DataListItemCollection (itemsArray);
}
return items;
}
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to items.")]
public virtual TableItemStyle ItemStyle {
get {
if (itemStyle == null) {
itemStyle = new TableItemStyle ();
if (IsTrackingViewState)
itemStyle.TrackViewState ();
}
return itemStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for items.")]
public virtual ITemplate ItemTemplate {
get { return itemTemplate; }
set { itemTemplate = value; }
}
#if !NET_2_0
[Bindable (true)]
#endif
[DefaultValue (0), WebCategory ("Layout")]
[WebSysDescription ("The number of columns that should be used.")]
public virtual int RepeatColumns {
get {
object o = ViewState ["RepeatColumns"];
if (o != null)
return (int) o;
return 0;
}
set {
if (value < 0)
throw new ArgumentOutOfRangeException ("value", "RepeatColumns value has to be 0 for 'not set' or > 0.");
ViewState ["RepeatColumns"] = value;
}
}
#if !NET_2_0
[Bindable (true)]
#endif
[DefaultValue (RepeatDirection.Vertical), WebCategory ("Layout")]
[WebSysDescription ("Which direction should be used when filling the columns.")]
public virtual RepeatDirection RepeatDirection {
get {
object o = ViewState ["RepeatDirection"];
if (o != null)
return (RepeatDirection) o;
return RepeatDirection.Vertical;
}
set {
if (!Enum.IsDefined (typeof (RepeatDirection), value))
throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");
ViewState ["RepeatDirection"] = value;
}
}
#if !NET_2_0
[Bindable (true)]
#endif
[DefaultValue (RepeatLayout.Table), WebCategory ("Layout")]
[WebSysDescription ("The type of layout - mechanism that is used.")]
public virtual RepeatLayout RepeatLayout {
get {
object o = ViewState ["RepeatLayout"];
if (o != null)
return (RepeatLayout) o;
return RepeatLayout.Table;
}
set {
if (!Enum.IsDefined (typeof (RepeatLayout), value))
throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");
ViewState ["RepeatLayout"] = value;
}
}
[DefaultValue (-1), Bindable (true)]
[WebSysDescription ("The currently selected item index number.")]
public virtual int SelectedIndex {
get {
#if NET_2_0
return selectedIndex;
#else
object o = ViewState ["SelectedIndex"];
if (o != null)
return (int) o;
return -1;
#endif
}
set {
//FIXME: Looks like a bug in Microsoft's specs.
// Exception is missing in document. I haven't tested the case
// But I think exception should follow
if (value < -1)
throw new ArgumentOutOfRangeException("value");
int prevSel = SelectedIndex;
#if NET_2_0
selectedIndex = value;
#else
ViewState ["SelectedIndex"] = value;
#endif
DataListItem prevSelItem;
ListItemType liType;
if (itemsArray != null) {
if (prevSel >= 0 && prevSel < itemsArray.Count) {
prevSelItem = (DataListItem) itemsArray [prevSel];
if (prevSelItem.ItemType != ListItemType.EditItem) {
liType = ((prevSel % 2) == 0 ? ListItemType.AlternatingItem :
ListItemType.Item);
prevSelItem.SetItemType (liType);
}
}
if (value >= 0 && value < itemsArray.Count) {
prevSelItem = (DataListItem) itemsArray [value];
if (prevSelItem.ItemType != ListItemType.EditItem) {
prevSelItem.SetItemType (ListItemType.SelectedItem);
}
}
}
}
}
[Browsable (false)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[WebSysDescription ("The currently selected item.")]
public virtual DataListItem SelectedItem {
get {
if (SelectedIndex == -1)
return null;
return Items [SelectedIndex];
}
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style used for the currently selected item.")]
public virtual TableItemStyle SelectedItemStyle {
get {
if (selectedItemStyle == null) {
selectedItemStyle = new TableItemStyle ();
if (IsTrackingViewState)
selectedItemStyle.TrackViewState ();
}
return selectedItemStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for currently selected items.")]
public virtual ITemplate SelectedItemTemplate {
get { return selectedItemTemplate; }
set { selectedItemTemplate = value; }
}
[DefaultValue (null)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
[NotifyParentProperty (true)]
[WebCategory ("Style")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The style applied to separators.")]
public virtual TableItemStyle SeparatorStyle {
get {
if (separatorStyle == null) {
separatorStyle = new TableItemStyle ();
if (IsTrackingViewState)
separatorStyle.TrackViewState ();
}
return separatorStyle;
}
}
[Browsable (false)]
[DefaultValue (null)]
[TemplateContainer (typeof (DataListItem))]
[PersistenceMode (PersistenceMode.InnerProperty)]
[WebSysDescription ("The template used for separators.")]
public virtual ITemplate SeparatorTemplate {
get { return separatorTemplate; }
set { separatorTemplate = value; }
}
#if !NET_2_0
[Bindable (true)]
#endif
[DefaultValue (true), WebCategory ("Appearance")]
[WebSysDescription ("Display the header for the DataList.")]
public virtual bool ShowHeader {
get {
object o = ViewState ["ShowHeader"];
if (o != null)
return (bool) o;
return true;
}
set { ViewState ["ShowHeader"] = value; }
}
#if !NET_2_0
[Bindable (true)]
#endif
[DefaultValue (true), WebCategory ("Appearance")]
[WebSysDescription ("Display the footer for the DataList.")]
public virtual bool ShowFooter {
get {
object o = ViewState ["ShowFooter"];
if (o != null)
return (bool) o;
return true;
}
set
{
ViewState["ShowFooter"] = value;
}
}
[WebCategory ("Action")]
[WebSysDescription ("Raised when a cancel command is generated.")]
public event DataListCommandEventHandler CancelCommand {
add { Events.AddHandler (CancelCommandEvent, value); }
remove { Events.RemoveHandler (CancelCommandEvent, value); }
}
[WebCategory ("Action")]
[WebSysDescription ("Raised when a delete command is generated.")]
public event DataListCommandEventHandler DeleteCommand {
add { Events.AddHandler (DeleteCommandEvent, value); }
remove { Events.RemoveHandler (DeleteCommandEvent, value); }
}
[WebCategory ("Action")]
[WebSysDescription ("Raised when an edit command is generated.")]
public event DataListCommandEventHandler EditCommand {
add { Events.AddHandler (EditCommandEvent, value); }
remove { Events.RemoveHandler (EditCommandEvent, value); }
}
[WebCategory ("Action")]
[WebSysDescription ("Raised when an item command is generated.")]
public event DataListCommandEventHandler ItemCommand {
add { Events.AddHandler (ItemCommandEvent, value); }
remove { Events.RemoveHandler (ItemCommandEvent, value); }
}
[WebCategory ("Behavior")]
[WebSysDescription ("Raised when a new item is created.")]
public event DataListItemEventHandler ItemCreated {
add { Events.AddHandler (ItemCreatedEvent, value); }
remove { Events.RemoveHandler (ItemCreatedEvent, value); }
}
[WebCategory ("Behavior")]
[WebSysDescription ("Raised when a item gets data-bound.")]
public event DataListItemEventHandler ItemDataBound {
add { Events.AddHandler (ItemDataBoundEvent, value); }
remove { Events.RemoveHandler (ItemDataBoundEvent, value); }
}
[WebCategory ("Action")]
[WebSysDescription ("Raised when an update command is generated.")]
public event DataListCommandEventHandler UpdateCommand {
add { Events.AddHandler (UpdateCommandEvent, value); }
remove { Events.RemoveHandler (UpdateCommandEvent, value); }
}
protected override Style CreateControlStyle ()
{
TableStyle retVal = new TableStyle (ViewState);
retVal.CellSpacing = 0;
return retVal;
}
protected override void LoadViewState (object savedState)
{
if (savedState == null)
return;
object [] states = (object []) savedState;
if (states [0] != null)
base.LoadViewState (states [0]);
if (states [1] != null)
alternatingItemStyle.LoadViewState (states [1]);
if (states [2] != null)
editItemStyle.LoadViewState (states [2]);
if (states [3] != null)
footerStyle.LoadViewState (states [3]);
if (states [4] != null)
headerStyle.LoadViewState (states [4]);
if (states [5] != null)
itemStyle.LoadViewState (states [5]);
if (states [6] != null)
selectedItemStyle.LoadViewState (states [6]);
if (states [7] != null)
separatorStyle.LoadViewState (states [7]);
}
protected override object SaveViewState()
{
object [] states = new object [8];
states [0] = base.SaveViewState ();
states [1] = (alternatingItemStyle == null ? null : alternatingItemStyle.SaveViewState ());
states [2] = (editItemStyle == null ? null : editItemStyle.SaveViewState ());
states [3] = (footerStyle == null ? null : footerStyle.SaveViewState ());
states [4] = (headerStyle == null ? null : headerStyle.SaveViewState ());
states [5] = (itemStyle == null ? null : itemStyle.SaveViewState ());
states [6] = (selectedItemStyle == null ? null : selectedItemStyle.SaveViewState ());
states [7] = (separatorStyle == null ? null : separatorStyle.SaveViewState ());
return states;
}
protected override void TrackViewState ()
{
base.TrackViewState ();
if (alternatingItemStyle != null)
alternatingItemStyle.TrackViewState ();
if (editItemStyle != null)
editItemStyle.TrackViewState ();
if (footerStyle != null)
footerStyle.TrackViewState ();
if (headerStyle != null)
headerStyle.TrackViewState ();
if (itemStyle != null)
itemStyle.TrackViewState ();
if (selectedItemStyle != null)
selectedItemStyle.TrackViewState ();
if (separatorStyle != null)
separatorStyle.TrackViewState ();
}
#if NET_2_0
protected override void OnInit (EventArgs e)
{
Page.RegisterRequiresControlState (this);
base.OnInit (e);
}
protected internal override void LoadControlState (object ob)
{
if (ob == null) return;
Pair state = (Pair) ob;
base.LoadControlState (state.First);
if (state.Second != null)
SelectedIndex = (int) state.Second;
}
protected internal override object SaveControlState ()
{
object bstate = base.SaveControlState ();
object mstate = SelectedIndex != -1 ? (object) SelectedIndex : null;
if (bstate != null || mstate != null)
return new Pair (bstate, mstate);
else
return null;
}
#endif
protected override bool OnBubbleEvent (object source, EventArgs e)
{
if (!(e is DataListCommandEventArgs))
return false;
DataListCommandEventArgs args = (DataListCommandEventArgs) e;
OnItemCommand (args);
string cmdName = args.CommandName.ToLower ();
if (cmdName == "cancel") {
OnCancelCommand (args);
} else if (cmdName == "delete") {
OnDeleteCommand (args);
} else if (cmdName == "edit") {
OnEditCommand (args);
} else if (cmdName == "select") {
SelectedIndex = args.Item.ItemIndex;
OnSelectedIndexChanged (EventArgs.Empty);
} else if (cmdName == "update") {
OnUpdateCommand (args);
}
return true;
}
void InvokeCommandEvent (DataListCommandEventArgs args, object key)
{
DataListCommandEventHandler dlceh = (DataListCommandEventHandler) Events [key];
if (dlceh != null)
dlceh (this, args);
}
void InvokeItemEvent (DataListItemEventArgs args, object key)
{
DataListItemEventHandler dlieh = (DataListItemEventHandler) Events [key];
if (dlieh != null)
dlieh (this, args);
}
protected virtual void OnCancelCommand (DataListCommandEventArgs e)
{
InvokeCommandEvent (e, CancelCommandEvent);
}
protected virtual void OnDeleteCommand (DataListCommandEventArgs e)
{
InvokeCommandEvent (e, DeleteCommandEvent);
}
protected virtual void OnEditCommand (DataListCommandEventArgs e)
{
InvokeCommandEvent (e, EditCommandEvent);
}
protected virtual void OnItemCommand (DataListCommandEventArgs e)
{
InvokeCommandEvent (e, ItemCommandEvent);
}
protected virtual void OnItemCreated (DataListItemEventArgs e)
{
InvokeItemEvent (e, ItemCreatedEvent);
}
protected virtual void OnItemDataBound (DataListItemEventArgs e)
{
InvokeItemEvent (e, ItemDataBoundEvent);
}
protected virtual void OnUpdateCommand (DataListCommandEventArgs e)
{
InvokeCommandEvent (e, UpdateCommandEvent);
}
protected override void RenderContents (HtmlTextWriter writer)
{
if (Controls.Count == 0)
return;
RepeatInfo repeater = new RepeatInfo ();
Table templateTable = null;
if (extractTemplateRows) {
repeater.RepeatDirection = RepeatDirection.Vertical;
repeater.RepeatLayout = RepeatLayout.Flow;
repeater.RepeatColumns = 1;
repeater.OuterTableImplied = true;
templateTable = new Table ();
templateTable.ID = ClientID;
templateTable.CopyBaseAttributes (this);
templateTable.ApplyStyle (ControlStyle);
templateTable.RenderBeginTag (writer);
} else {
repeater.RepeatDirection = RepeatDirection;
repeater.RepeatLayout = RepeatLayout;
repeater.RepeatColumns = RepeatColumns;
}
repeater.RenderRepeater (writer, this, ControlStyle, this);
if (templateTable != null) {
templateTable.RenderEndTag (writer);
}
}
private DataListItem GetItem (ListItemType itemType, int repeatIndex)
{
DataListItem retVal = null;
switch (itemType) {
case ListItemType.Header:
retVal = (DataListItem) Controls [0];
break;
case ListItemType.Footer:
retVal = (DataListItem) Controls [Controls.Count - 1];
break;
case ListItemType.Item:
goto case ListItemType.EditItem;
case ListItemType.AlternatingItem:
goto case ListItemType.EditItem;
case ListItemType.SelectedItem:
goto case ListItemType.EditItem;
case ListItemType.EditItem:
retVal = (DataListItem) itemsArray [repeatIndex];
break;
case ListItemType.Separator:
int index = 2 * repeatIndex + 1;
if (headerTemplate != null)
index ++;
retVal = (DataListItem) Controls [index];
break;
}
return retVal;
}
///
/// Undocumented
///
protected override void CreateControlHierarchy (bool useDataSource)
{
IEnumerable source = null;
ArrayList dkeys = DataKeysArray;
if (itemsArray != null) {
itemsArray.Clear ();
} else {
itemsArray = new ArrayList ();
}
extractTemplateRows = ExtractTemplateRows;
if (!useDataSource) {
int count = (int) ViewState ["_!ItemCount"];
if (count != -1) {
source = new DataSourceInternal (count);
itemsArray.Capacity = count;
}
} else {
dkeys.Clear ();
source = GetResolvedDataSource ();
if (source is ICollection) {
dkeys.Capacity = ((ICollection) source).Count;
itemsArray.Capacity = ((ICollection) source).Count;
}
}
int itemCount = 0;
if (source != null) {
int index = 0;
int editIndex = EditItemIndex;
int selIndex = SelectedIndex;
string dataKey = DataKeyField;
if (headerTemplate != null)
CreateItem (-1, ListItemType.Header, useDataSource, null);
foreach (object current in source) {
if (useDataSource) {
try {
dkeys.Add (DataBinder.GetPropertyValue (current, dataKey));
} catch {
dkeys.Add (dkeys.Count);
}
}
ListItemType type = ListItemType.Item;
if (index == editIndex) {
type = ListItemType.EditItem;
} else if (index == selIndex) {
type = ListItemType.SelectedItem;
} else if ((index % 2) != 0) {
type = ListItemType.AlternatingItem;
}
itemsArray.Add (CreateItem (index, type, useDataSource, current));
if (separatorTemplate != null)
CreateItem (index, ListItemType.Separator, useDataSource, null);
itemCount++;
index++;
}
if (footerTemplate != null)
CreateItem (-1, ListItemType.Footer, useDataSource, null);
}
if (useDataSource)
ViewState ["_!ItemCount"] = (source != null ? itemCount : -1);
}
///
/// Undocumented
///
protected virtual DataListItem CreateItem (int itemIndex, ListItemType itemType)
{
return new DataListItem (itemIndex, itemType);
}
private DataListItem CreateItem (int itemIndex, ListItemType itemType, bool dataBind, object dataItem)
{
DataListItem retVal = CreateItem (itemIndex, itemType);
DataListItemEventArgs e = new DataListItemEventArgs (retVal);
InitializeItem (retVal);
if (dataBind)
retVal.DataItem = dataItem;
OnItemCreated (e);
Controls.Add (retVal);
if (dataBind) {
retVal.DataBind ();
OnItemDataBound (e);
retVal.DataItem = null;
}
return retVal;
}
///
/// Undocumented
///
protected override void PrepareControlHierarchy ()
{
if (Controls.Count == 0)
return;
Style defaultStyle = null;
Style rowStyle = null;
if (alternatingItemStyle != null) {
defaultStyle = new TableItemStyle ();
defaultStyle.CopyFrom (itemStyle);
defaultStyle.CopyFrom (alternatingItemStyle);
} else {
defaultStyle = itemStyle;
}
foreach (DataListItem current in Controls) {
rowStyle = null;
switch (current.ItemType) {
case ListItemType.Header:
if (headerStyle != null)
rowStyle = headerStyle;
break;
case ListItemType.Footer:
if (footerStyle != null)
rowStyle = footerStyle;
break;
case ListItemType.Separator:
rowStyle = separatorStyle;
break;
case ListItemType.Item:
rowStyle = itemStyle;
break;
case ListItemType.AlternatingItem:
rowStyle = defaultStyle;
break;
case ListItemType.SelectedItem:
rowStyle = new TableItemStyle ();
if ((current.ItemIndex % 2) == 0) {
rowStyle.CopyFrom (itemStyle);
} else {
rowStyle.CopyFrom (defaultStyle);
}
rowStyle.CopyFrom (selectedItemStyle);
break;
case ListItemType.EditItem:
rowStyle = new TableItemStyle ();
if ((current.ItemIndex % 2) == 0) {
rowStyle.CopyFrom (itemStyle);
} else {
rowStyle.CopyFrom (defaultStyle);
}
if (current.ItemIndex == SelectedIndex)
rowStyle.CopyFrom (selectedItemStyle);
rowStyle.CopyFrom (editItemStyle);
break;
}
if (rowStyle == null)
continue;
if (!extractTemplateRows) {
current.MergeStyle (rowStyle);
continue;
}
if (current.HasControls ()) {
int len = current.Controls.Count;
for (int i = 0 ; i < len ; i++) {
Control currentCtrl = current.Controls [i];
if (!(currentCtrl is Table))
continue;
foreach (TableRow cRow in ((Table) currentCtrl).Rows)
cRow.MergeStyle (rowStyle);
}
}
}
}
///
/// Undocumented
///
protected virtual void InitializeItem (DataListItem item)
{
ListItemType type = item.ItemType;
ITemplate template = itemTemplate;
switch (type) {
case ListItemType.Header:
template = headerTemplate;
break;
case ListItemType.Footer:
template = footerTemplate;
break;
case ListItemType.AlternatingItem:
if (alternatingItemTemplate != null)
template = alternatingItemTemplate;
break;
case ListItemType.SelectedItem:
if (selectedItemTemplate != null) {
template = selectedItemTemplate;
break;
}
if ((item.ItemIndex % 2) != 0)
goto case ListItemType.AlternatingItem;
break;
case ListItemType.EditItem:
if (editItemTemplate != null) {
template = editItemTemplate;
break;
}
if (item.ItemIndex == SelectedIndex)
goto case ListItemType.SelectedItem;
if ((item.ItemIndex % 2) != 0)
goto case ListItemType.AlternatingItem;
break;
case ListItemType.Separator:
template = separatorTemplate;
break;
}
if (template != null)
template.InstantiateIn (item);
}
bool IRepeatInfoUser.HasFooter {
get { return (ShowFooter && footerTemplate != null); }
}
bool IRepeatInfoUser.HasHeader {
get { return (ShowHeader && headerTemplate != null); }
}
bool IRepeatInfoUser.HasSeparators {
get { return (separatorTemplate != null); }
}
int IRepeatInfoUser.RepeatedItemCount {
get {
if (itemsArray != null)
return itemsArray.Count;
return 0;
}
}
void IRepeatInfoUser.RenderItem (ListItemType itemType,
int repeatIndex,
RepeatInfo repeatInfo,
HtmlTextWriter writer)
{
DataListItem item = GetItem (itemType, repeatIndex);
if (item != null)
item.RenderItem (writer,
extractTemplateRows,
(repeatInfo.RepeatLayout == RepeatLayout.Table));
}
Style IRepeatInfoUser.GetItemStyle (ListItemType itemType, int repeatIndex)
{
DataListItem item = GetItem (itemType, repeatIndex);
if (item == null || !item.ControlStyleCreated)
return null;
return item.ControlStyle;
}
}
}