[WebSysDescription ("")]
[WebCategory ("Misc")]
public virtual int EditItemIndex {
-#if NET_2_0
- get { return editIndex; }
- set {
- if (value < -1)
- throw new ArgumentOutOfRangeException ("EditItemIndex", "< -1");
- editIndex = value;
- }
-#else
get {
object o = ViewState ["EditItemIndex"];
return (o == null) ? -1 : (int) o;
throw new ArgumentOutOfRangeException ("EditItemIndex", "< -1");
ViewState ["EditItemIndex"] = value;
}
-#endif
}
[DefaultValue (null)]
object o = ViewState ["RepeatColumns"];
return (o == null) ? 0 : (int) o;
}
- set { ViewState ["RepeatColumns"] = value; }
+ set {
+ if (value < 0)
+ throw new ArgumentOutOfRangeException ("value", "RepeatColumns value has to be 0 for 'not set' or > 0.");
+
+ ViewState ["RepeatColumns"] = value;
+ }
}
#if ONLY_1_1
[WebSysDescription ("")]
[WebCategory ("Layout")]
public virtual int SelectedIndex {
-#if NET_2_0
- get { return selectedIndex; }
- set {
- if (value < -1)
- throw new ArgumentOutOfRangeException ("SelectedIndex", "< -1");
- selectedIndex = value;
- }
-#else
get {
object o = ViewState ["SelectedIndex"];
return (o == null) ? -1 : (int) o;
throw new ArgumentOutOfRangeException ("SelectedIndex", "< -1");
ViewState ["SelectedIndex"] = value;
}
-#endif
}
[Browsable (false)]
void DoItem (int i, ListItemType t, object d, bool databind)
{
DataListItem itm = CreateItem (i, t);
- itm.DataItem = d;
+ if (databind)
+ itm.DataItem = d;
DataListItemEventArgs e = new DataListItemEventArgs (itm);
InitializeItem (itm);
Controls.Add (itm);
if (i != -1)
ItemList.Add (itm);
+
OnItemCreated (e);
if (databind) {
itm.DataBind ();
OnItemDataBound (e);
+ itm.DataItem = null;
}
}
- private void DoItemInLoop (int i, object d, bool databind)
+ private void DoItemInLoop (int i, object d, bool databind, ListItemType type)
{
- if (i > 0 && SeparatorTemplate != null)
- DoItem (i - 1, ListItemType.Separator, null, databind);
+ DoItem (i, type, d, databind);
+ if (SeparatorTemplate != null)
+ DoItem (i, ListItemType.Separator, null, databind);
- DoItem (i, i % 2 == 0 ? ListItemType.Item : ListItemType.AlternatingItem, d, databind);
}
protected override void CreateControlHierarchy (bool useDataSource)
Controls.Clear();
IEnumerable ds = null;
+ ArrayList keys = null;
if (useDataSource) {
idx = 0;
+#if NET_2_0
+ if (IsBoundUsingDataSourceID)
+ ds = GetData();
+ else
+#endif
ds = DataSourceResolver.ResolveDataSource (DataSource, DataMember);
+ keys = DataKeysArray;
+ keys.Clear ();
} else {
idx = (int) ViewState ["Items"];
}
DoItem (-1, ListItemType.Header, null, useDataSource);
// items
+ int selected_index = SelectedIndex;
+ int edit_item_index = EditItemIndex;
+ ListItemType type;
if (ds != null) {
+ string key = DataKeyField;
foreach (object o in ds) {
- DoItemInLoop (idx, o, useDataSource);
+ if (useDataSource && key != "")
+ keys.Add (DataBinder.GetPropertyValue (o, key));
+ type = ListItemType.Item;
+ if (idx == edit_item_index)
+ type = ListItemType.EditItem;
+ else if (idx == selected_index)
+ type = ListItemType.SelectedItem;
+ else if (idx % 2 != 0)
+ type = ListItemType.AlternatingItem;
+
+ DoItemInLoop (idx, o, useDataSource, type);
idx++;
}
} else {
for (int i = 0; i < idx; i++) {
- DoItemInLoop (i, null, useDataSource);
+ type = ListItemType.Item;
+ if (idx == edit_item_index)
+ type = ListItemType.EditItem;
+ else if (idx == selected_index)
+ type = ListItemType.SelectedItem;
+ else if (idx % 2 != 0)
+ type = ListItemType.AlternatingItem;
+
+ DoItemInLoop (i, null, useDataSource, type);
}
}
// not kept (directly) in the DataList ViewState
return new TableStyle ();
#else
- return new TableStyle (ViewState);
+ TableStyle tableStyle = new TableStyle (ViewState);
+ tableStyle.CellSpacing = 0;
+ return tableStyle;
#endif
}
case ListItemType.SelectedItem:
case ListItemType.EditItem:
int index = item.ItemIndex;
- if (SelectedIndex == index)
- t = SelectedItemTemplate;
- else if (EditItemIndex == index)
+ if ((EditItemIndex == index) && (EditItemTemplate != null))
t = EditItemTemplate;
+ else if ((SelectedIndex == index) && (SelectedItemTemplate != null))
+ t = SelectedItemTemplate;
else if (((index & 1) == 0) || (alternatingItemTemplate == null))
t = ItemTemplate;
else
protected override void LoadViewState (object savedState)
{
object[] state = (object[]) savedState;
+#if NET_2_0
+ base.LoadViewState (state [8]);
+#else
base.LoadViewState (state [0]);
+#endif
if (state [1] != null)
ItemStyle.LoadViewState (state [1]);
if (state [2] != null)
if (state [7] != null)
FooterStyle.LoadViewState (state [7]);
}
-#if NET_2_0
- protected internal override void LoadControlState (object savedState)
- {
- // FIXME: what's in Triplet.First ?
- // ??? maybe a some space for base.LoadControlState ???
- if (savedState == null) {
- // reset to default values
- editIndex = -1;
- selectedIndex = -1;
- } else {
- Triplet t = (Triplet) savedState;
- if (t.Second == null) {
- editIndex = -1;
- } else {
- editIndex = (int) t.Second;
- }
- if (t.Third == null) {
- selectedIndex = -1;
- } else {
- selectedIndex = (int) t.Third;
- }
- }
- }
- protected internal override object SaveControlState ()
- {
- bool e = (editIndex == -1);
- bool s = (selectedIndex == -1);
- if (e && s)
- return null;
-
- Triplet t = new Triplet ();
- if (!e)
- t.Second = editIndex;
- if (!s)
- t.Third = selectedIndex;
-
- return (object) t;
- }
-#endif
protected override bool OnBubbleEvent (object source, EventArgs e)
{
DataListCommandEventArgs dlca = (e as DataListCommandEventArgs);
string cn = dlca.CommandName;
CultureInfo inv = CultureInfo.InvariantCulture;
+ OnItemCommand (dlca);
if (String.Compare (cn, CancelCommandName, true, inv) == 0) {
OnCancelCommand (dlca);
return true;
} else if (String.Compare (cn, UpdateCommandName, true, inv) == 0) {
OnUpdateCommand (dlca);
return true;
- } else if (String.Compare (cn, "ITEM", true, inv) == 0) {
- OnItemCommand (dlca);
- return true;
}
-
return false;
}
updateCommand (this, e);
}
+ void ApplyControlStyle (Control ctrl, Style style)
+ {
+ if (style == null || false == ctrl.HasControls ())
+ return;
+
+ foreach (Control c in ctrl.Controls) {
+ if (c is Table) {
+ Table tbl = (Table) c;
+ foreach (TableRow row in tbl.Rows)
+ row.MergeStyle (style);
+ }
+ }
+ }
+
protected override void PrepareControlHierarchy ()
{
+ if (!HasControls () || Controls.Count == 0)
+ return; // No one called CreateControlHierarchy() with DataSource != null
+
+ Style alt = null;
+ foreach (DataListItem item in Controls) {
+ switch (item.ItemType) {
+ case ListItemType.Item:
+ item.MergeStyle (itemStyle);
+ ApplyControlStyle (item, itemStyle);
+ break;
+ case ListItemType.AlternatingItem:
+ if (alt == null) {
+ if (alternatingItemStyle != null) {
+ alt = new TableItemStyle ();
+ alt.CopyFrom (itemStyle);
+ alt.CopyFrom (alternatingItemStyle);
+ } else {
+ alt = itemStyle;
+ }
+ }
+
+ item.MergeStyle (alt);
+ ApplyControlStyle (item, alt);
+ break;
+ case ListItemType.EditItem:
+ if (editItemStyle != null) {
+ item.MergeStyle (editItemStyle);
+ ApplyControlStyle (item, editItemStyle);
+ } else {
+ item.MergeStyle (itemStyle);
+ ApplyControlStyle (item, itemStyle);
+ }
+ break;
+ case ListItemType.Footer:
+ if (!ShowFooter) {
+ item.Visible = false;
+ break;
+ }
+ if (footerStyle != null) {
+ item.MergeStyle (footerStyle);
+ ApplyControlStyle (item, footerStyle);
+ }
+ break;
+ case ListItemType.Header:
+ if (!ShowHeader) {
+ item.Visible = false;
+ break;
+ }
+ if (headerStyle != null) {
+ item.MergeStyle (headerStyle);
+ ApplyControlStyle (item, headerStyle);
+ }
+ break;
+ case ListItemType.SelectedItem:
+ if (selectedItemStyle != null) {
+ item.MergeStyle (selectedItemStyle);
+ ApplyControlStyle (item, selectedItemStyle);
+ } else {
+ item.MergeStyle (itemStyle);
+ ApplyControlStyle (item, itemStyle);
+ }
+ break;
+ case ListItemType.Separator:
+ if (separatorStyle != null) {
+ item.MergeStyle(separatorStyle);
+ ApplyControlStyle (item, separatorStyle);
+ }
+ else {
+ item.MergeStyle (itemStyle);
+ ApplyControlStyle (item, itemStyle);
+ }
+ break;
+ }
+ }
}
#if NET_2_0
#endif
override void RenderContents (HtmlTextWriter writer)
{
+ if (Items.Count == 0)
+ return;
+
RepeatInfo ri = new RepeatInfo ();
ri.RepeatColumns = RepeatColumns;
ri.RepeatDirection = RepeatDirection;
ri.RepeatLayout = RepeatLayout;
+ ri.CaptionAlign = CaptionAlign;
+ ri.Caption = Caption;
+ ri.UseAccessibleHeader = UseAccessibleHeader;
/*
// debugging stuff that I prefer to keep for a while
Console.WriteLine ("RepeatColumns {0}", ri.RepeatColumns);
bool extract = ExtractTemplateRows;
if (extract) {
ri.OuterTableImplied = true;
- writer.AddAttribute (HtmlTextWriterAttribute.Id, ID);
+ writer.AddAttribute (HtmlTextWriterAttribute.Id, ClientID);
if (ControlStyleCreated) {
ControlStyle.AddAttributesToRender (writer);
}
writer.RenderBeginTag (HtmlTextWriterTag.Table);
- ri.RenderRepeater (writer, this, TableStyle, this);
+ ri.RenderRepeater (writer, this, ControlStyle, this);
writer.RenderEndTag ();
} else {
- ri.RenderRepeater (writer, this, TableStyle, this);
+ ri.RenderRepeater (writer, this, ControlStyle, this);
}
}
Style IRepeatInfoUser.GetItemStyle (ListItemType itemType, int repeatIndex)
{
+ DataListItem item = null;
switch (itemType) {
case ListItemType.Header:
- if (repeatIndex >= Items.Count)
- throw new ArgumentOutOfRangeException ("repeatIndex");
- return headerStyle;
case ListItemType.Footer:
- if (repeatIndex >= Items.Count)
- throw new ArgumentOutOfRangeException ("repeatIndex");
- return footerStyle;
+ if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+ throw new ArgumentOutOfRangeException ();
+
+ item = FindFirstItem (itemType);
+ break;
case ListItemType.Item:
case ListItemType.AlternatingItem:
case ListItemType.SelectedItem:
case ListItemType.EditItem:
- if (repeatIndex >= Items.Count)
- throw new ArgumentOutOfRangeException ("repeatIndex");
+ if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+ throw new ArgumentOutOfRangeException ();
- if (SelectedIndex == repeatIndex)
- return selectedItemStyle;
-
- if (EditItemIndex == repeatIndex)
- return editItemStyle;
-
- if (((repeatIndex & 1) == 0) || (alternatingItemStyle == null))
- return itemStyle;
-
- // alternate style
- TableItemStyle alt = new TableItemStyle ();
- alt.CopyFrom (itemStyle);
- alt.CopyFrom (alternatingItemStyle);
- return alt;
+ item = FindBestItem (repeatIndex);
+ break;
case ListItemType.Separator:
- if (repeatIndex >= Items.Count)
- throw new ArgumentOutOfRangeException ("repeatIndex");
- return separatorStyle;
+ if (repeatIndex >= 0 && (!HasControls () || repeatIndex >= Controls.Count))
+ throw new ArgumentOutOfRangeException ();
+
+ item = FindSpecificItem (itemType, repeatIndex);
+ break;
default:
- return null;
+ item = null;
+ break;
}
+
+ if (item == null || item.ControlStyleCreated == false)
+ return null;
+
+ return item.ControlStyle;
}
// Header and Footer don't have a "real" index (-1)