Several people have noted that when using a DataList whose RepeatColumns property value is 0, the DataListAdapter crashes:
I thought the authors of those threads and other forum readers might want to comment on the experimental version of an enhanced DataListAdapter that attempts to handle the case of RepeatColumns equals 0 in a manner consistent with the framework's original intent:
If this property is set to 0, the DataList control displays its items in a single row or column, based on the value of the RepeatDirection property. If the RepeatDirection property is set to RepeatDirection.Horizontal, the items are displayed in a single row. If the RepeatDirection property is set to RepeatDirection.Vertical, the items are displayed in a single column.
http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref26/html/P_System_Web_UI_WebControls_DataList_RepeatColumns.asp
If you are using version 1.1 of the kit, here is a replacement for DataListAdapter.cs (I've not created a VB version but could if it is something folks really need to see right now). I'm interested in comments and criticism of this version. Thanks.
using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace CSSFriendly
{
public class DataListAdapter : System.Web.UI.WebControls.Adapters.WebControlAdapter
{
private int RepeatColumns
{
get
{
DataList dataList = Control as DataList;
int nRet = 1;
if (dataList != null)
{
if (dataList.RepeatColumns == 0)
{
if (dataList.RepeatDirection == RepeatDirection.Horizontal)
{
nRet = dataList.Items.Count;
}
}
else
{
nRet = dataList.RepeatColumns;
}
}
return nRet;
}
}
public DataListAdapter()
{
}
/// ///////////////////////////////////////////////////////////////////////////////
/// PROTECTED
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
RegisterScripts();
}
protected override void RenderBeginTag(HtmlTextWriter writer)
{
if ((Control != null) && (Control.Attributes["CssSelectorClass"] != null) && (Control.Attributes["CssSelectorClass"].Length > 0))
{
writer.WriteLine();
writer.WriteBeginTag("div");
writer.WriteAttribute("class", Control.Attributes["CssSelectorClass"]);
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
}
writer.WriteLine();
writer.WriteBeginTag("div");
writer.WriteAttribute("class", "AspNet-DataList");
writer.Write(HtmlTextWriter.TagRightChar);
}
protected override void RenderEndTag(HtmlTextWriter writer)
{
writer.WriteEndTag("div");
if ((Control != null) && (Control.Attributes["CssSelectorClass"] != null) && (Control.Attributes["CssSelectorClass"].Length > 0))
{
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("div");
}
writer.WriteLine();
}
protected override void RenderContents(HtmlTextWriter writer)
{
DataList dataList = Control as DataList;
if (dataList != null)
{
writer.Indent++;
writer.WriteLine();
writer.WriteBeginTag("table");
writer.WriteAttribute("cellpadding", "0");
writer.WriteAttribute("cellspacing", "0");
writer.WriteAttribute("summary", Control.ToolTip);
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
if (dataList.HeaderTemplate != null)
{
PlaceHolder container = new PlaceHolder();
dataList.HeaderTemplate.InstantiateIn(container);
container.DataBind();
if ((container.Controls.Count == 1) && typeof(LiteralControl).IsInstanceOfType(container.Controls[0]))
{
writer.WriteLine();
writer.WriteBeginTag("caption");
writer.Write(HtmlTextWriter.TagRightChar);
LiteralControl literalControl = container.Controls[0] as LiteralControl;
writer.Write(literalControl.Text.Trim());
writer.WriteEndTag("caption");
}
else
{
writer.WriteLine();
writer.WriteBeginTag("thead");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
writer.WriteLine();
writer.WriteBeginTag("tr");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
writer.WriteLine();
writer.WriteBeginTag("th");
writer.WriteAttribute("colspan", RepeatColumns.ToString());
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
writer.WriteLine();
container.RenderControl(writer);
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("th");
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tr");
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("thead");
}
}
if (dataList.FooterTemplate != null)
{
writer.WriteLine();
writer.WriteBeginTag("tfoot");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
writer.WriteLine();
writer.WriteBeginTag("tr");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
writer.WriteLine();
writer.WriteBeginTag("td");
writer.WriteAttribute("colspan", RepeatColumns.ToString());
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
PlaceHolder container = new PlaceHolder();
dataList.FooterTemplate.InstantiateIn(container);
container.DataBind();
container.RenderControl(writer);
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("td");
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tr");
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tfoot");
}
if (dataList.ItemTemplate != null)
{
writer.WriteLine();
writer.WriteBeginTag("tbody");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
int nItemsInColumn = (int)Math.Ceiling(((Double)dataList.Items.Count) / ((Double)RepeatColumns));
for (int iItem = 0; iItem < dataList.Items.Count; iItem++)
{
int nRow = iItem / RepeatColumns;
int nCol = iItem % RepeatColumns;
int nDesiredIndex = iItem;
if (dataList.RepeatDirection == RepeatDirection.Vertical)
{
nDesiredIndex = (nCol * nItemsInColumn) + nRow;
}
if ((iItem % RepeatColumns) == 0)
{
writer.WriteLine();
writer.WriteBeginTag("tr");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
}
writer.WriteLine();
writer.WriteBeginTag("td");
writer.Write(HtmlTextWriter.TagRightChar);
writer.Indent++;
foreach (Control itemCtrl in dataList.Items[iItem].Controls)
{
itemCtrl.RenderControl(writer);
}
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("td");
if (((iItem + 1) % RepeatColumns) == 0)
{
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tr");
}
}
if ((dataList.Items.Count % RepeatColumns) != 0)
{
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tr");
}
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("tbody");
}
writer.Indent--;
writer.WriteLine();
writer.WriteEndTag("table");
writer.Indent--;
writer.WriteLine();
}
}
/// ///////////////////////////////////////////////////////////////////////////////
/// PRIVATE
private void RegisterScripts()
{
}
}
}