Experimental DataListAdapter w/ RepeatColumns fix

Last post 09-03-2006 10:38 AM by angel eyes. 3 replies.

Sort Posts:

  • Experimental DataListAdapter w/ RepeatColumns fix

    05-27-2006, 5:42 PM
    • Contributor
      3,298 point Contributor
    • Russ Helfand
    • Member since 09-14-2005, 6:22 PM
    • Groovybits.com
    • Posts 741

    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()
            {
            }
        }
    }
    
    Russ Helfand
    Groovybits.com
  • vb version via conversion tools

    06-20-2006, 4:36 PM
    • Member
      70 point Member
    • Webdev511
    • Member since 07-01-2005, 6:37 AM
    • San Jose, CA
    • Posts 14
    I tripped over the datalistadapter problem when instering a wizard, found the c# fix, used online c# to vb.net converter, and fixed up the parts that the converters just couldn't get right. Wizard control now works fine, but I haven't used it outside a test enviroment.  
    Imports System
    Imports System.Data
    Imports System.Collections
    Imports System.Configuration
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    
    
    Namespace CSSFriendly
        _
        Public Class DataListAdapter
            Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter
    
            Private ReadOnly Property RepeatColumns() As Integer
                Get
                    Dim dataList As DataList = Nothing
                    Try
                        dataList = CType(Control, DataList)
                    Catch ex As Exception
                        '
    
                    End Try
                    Dim nRet As Integer = 1
                    If Not (dataList Is Nothing) Then
                        If dataList.RepeatColumns = 0 Then
                            If dataList.RepeatDirection = RepeatDirection.Horizontal Then
                                nRet = dataList.Items.Count
                            End If
                        Else
                            nRet = dataList.RepeatColumns
                        End If
                    End If
                    Return nRet
                End Get
            End Property
    
    
            Public Sub New()
            End Sub 'New
    
    
            '/ ///////////////////////////////////////////////////////////////////////////////
            '/ PROTECTED        
    
            Protected Overrides Sub OnInit(ByVal e As EventArgs)
                MyBase.OnInit(e)
                RegisterScripts()
            End Sub 'OnInit
    
    
    
            Protected Overrides Sub RenderBeginTag(ByVal writer As HtmlTextWriter)
                If ((Not IsNothing(Control)) AndAlso (Not IsNothing(Control.Attributes.Item("CssSelectorClass"))) AndAlso (Control.Attributes.Item("CssSelectorClass").Length > 0)) Then
                    writer.WriteLine()
                    writer.WriteBeginTag("div")
                    writer.WriteAttribute("class", Control.Attributes("CssSelectorClass"))
                    writer.Write(HtmlTextWriter.TagRightChar)
                    writer.Indent = writer.Indent + 1
                End If
    
                writer.WriteLine()
                writer.WriteBeginTag("div")
                writer.WriteAttribute("class", "AspNet-DataList")
                writer.Write(HtmlTextWriter.TagRightChar)
            End Sub 'RenderBeginTag
    
    
    
            Protected Overrides Sub RenderEndTag(ByVal writer As HtmlTextWriter)
                writer.WriteEndTag("div")
    
                If ((Not IsNothing(Control)) AndAlso (Not IsNothing(Control.Attributes.Item("CssSelectorClass"))) AndAlso (Control.Attributes.Item("CssSelectorClass").Length > 0)) Then
                    writer.Indent -= 1
                    writer.WriteLine()
                    writer.WriteEndTag("div")
                End If
    
                writer.WriteLine()
            End Sub 'RenderEndTag
    
    
    
            Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
                Dim dataList As DataList = Nothing
                Try
                    dataList = CType(Control, DataList)
                Catch ex As Exception
                    '
    
                End Try
                If Not (dataList Is Nothing) Then
                    writer.Indent += 1
                    writer.WriteLine()
                    writer.WriteBeginTag("table")
                    writer.WriteAttribute("cellpadding", "0")
                    writer.WriteAttribute("cellspacing", "0")
                    writer.WriteAttribute("summary", Control.ToolTip)
                    writer.Write(HtmlTextWriter.TagRightChar)
                    writer.Indent += 1
    
                    If Not (dataList.HeaderTemplate Is Nothing) Then
                        Dim container As New PlaceHolder()
                        dataList.HeaderTemplate.InstantiateIn(container)
                        container.DataBind()
    
                        If container.Controls.Count = 1 And GetType(LiteralControl).IsInstanceOfType(container.Controls(0)) Then
                            writer.WriteLine()
                            writer.WriteBeginTag("caption")
                            writer.Write(HtmlTextWriter.TagRightChar)
    
                            Dim literalControl As LiteralControl = container.Controls(0) '
                            'ToDo: Error processing original source shown below
                            '
                            '
                            '-------------------------------------------------------------------------------^--- Syntax error: ';' expected
    
                            writer.Write(literalControl.Text.Trim())
    
                            writer.WriteEndTag("caption")
                        Else
                            writer.WriteLine()
                            writer.WriteBeginTag("thead")
                            writer.Write(HtmlTextWriter.TagRightChar)
                            writer.Indent += 1
    
                            writer.WriteLine()
                            writer.WriteBeginTag("tr")
                            writer.Write(HtmlTextWriter.TagRightChar)
                            writer.Indent += 1
    
                            writer.WriteLine()
                            writer.WriteBeginTag("th")
                            writer.WriteAttribute("colspan", RepeatColumns.ToString())
                            writer.Write(HtmlTextWriter.TagRightChar)
                            writer.Indent += 1
    
                            writer.WriteLine()
                            container.RenderControl(writer)
    
                            writer.Indent -= 1
                            writer.WriteLine()
                            writer.WriteEndTag("th")
    
                            writer.Indent -= 1
                            writer.WriteLine()
                            writer.WriteEndTag("tr")
    
                            writer.Indent -= 1
                            writer.WriteLine()
                            writer.WriteEndTag("thead")
                        End If
                    End If
    
                    If Not (dataList.FooterTemplate Is Nothing) Then
                        writer.WriteLine()
                        writer.WriteBeginTag("tfoot")
                        writer.Write(HtmlTextWriter.TagRightChar)
                        writer.Indent += 1
    
                        writer.WriteLine()
                        writer.WriteBeginTag("tr")
                        writer.Write(HtmlTextWriter.TagRightChar)
                        writer.Indent += 1
    
                        writer.WriteLine()
                        writer.WriteBeginTag("td")
                        writer.WriteAttribute("colspan", RepeatColumns.ToString())
                        writer.Write(HtmlTextWriter.TagRightChar)
                        writer.Indent += 1
    
                        Dim container As New PlaceHolder()
                        dataList.FooterTemplate.InstantiateIn(container)
                        container.DataBind()
                        container.RenderControl(writer)
    
                        writer.Indent -= 1
                        writer.WriteLine()
                        writer.WriteEndTag("td")
    
                        writer.Indent -= 1
                        writer.WriteLine()
                        writer.WriteEndTag("tr")
    
                        writer.Indent -= 1
                        writer.WriteLine()
                        writer.WriteEndTag("tfoot")
                    End If
    
                    If Not (dataList.ItemTemplate Is Nothing) Then
                        writer.WriteLine()
                        writer.WriteBeginTag("tbody")
                        writer.Write(HtmlTextWriter.TagRightChar)
                        writer.Indent += 1
    
                        Dim nItemsInColumn As Integer = CInt(Math.Ceiling((CType(dataList.Items.Count, [Double]) / CType(RepeatColumns, [Double]))))
                        Dim iItem As Integer
                        For iItem = 0 To dataList.Items.Count - 1
                            Dim nRow As Integer = iItem / RepeatColumns
                            Dim nCol As Integer = iItem Mod RepeatColumns
                            Dim nDesiredIndex As Integer = iItem
                            If dataList.RepeatDirection = RepeatDirection.Vertical Then
                                nDesiredIndex = nCol * nItemsInColumn + nRow
                            End If
    
                            If iItem Mod RepeatColumns = 0 Then
                                writer.WriteLine()
                                writer.WriteBeginTag("tr")
                                writer.Write(HtmlTextWriter.TagRightChar)
                                writer.Indent += 1
                            End If
    
                            writer.WriteLine()
                            writer.WriteBeginTag("td")
                            writer.Write(HtmlTextWriter.TagRightChar)
                            writer.Indent += 1
    
                            Dim itemCtrl As Control
                            For Each itemCtrl In dataList.Items(iItem).Controls
                                itemCtrl.RenderControl(writer)
                            Next itemCtrl
    
                            writer.Indent -= 1
                            writer.WriteLine()
                            writer.WriteEndTag("td")
    
                            If (iItem + 1) Mod RepeatColumns = 0 Then
                                writer.Indent -= 1
                                writer.WriteLine()
                                writer.WriteEndTag("tr")
                            End If
                        Next iItem
    
                        If dataList.Items.Count Mod RepeatColumns <> 0 Then
                            writer.Indent -= 1
                            writer.WriteLine()
                            writer.WriteEndTag("tr")
                        End If
    
                        writer.Indent -= 1
                        writer.WriteLine()
                        writer.WriteEndTag("tbody")
                    End If
    
                    writer.Indent -= 1
                    writer.WriteLine()
                    writer.WriteEndTag("table")
    
                    writer.Indent -= 1
                    writer.WriteLine()
                End If
            End Sub 'RenderContents
    
    
            '/ ///////////////////////////////////////////////////////////////////////////////
            '/ PRIVATE        
    
            Private Sub RegisterScripts()
            End Sub 'RegisterScripts
    
        End Class 'DataListAdapter
    
    End Namespace 'CSSFriendly
     
    Garth H
    San Jose, CA
    Microsoft Certified Professional
    Macromedia Certified Developer
    http://www.511th.com/
  • Re: vb version via conversion tools

    06-20-2006, 4:50 PM
    • Member
      70 point Member
    • Webdev511
    • Member since 07-01-2005, 6:37 AM
    • San Jose, CA
    • Posts 14

    Line 109 should be...

    Dim

    LiteralControl = container.Controls(0)

    I ONLY used it on the Wizard, so I'm going to bet that it probably won't work on a real datalist.

    Garth H
    San Jose, CA
    Microsoft Certified Professional
    Macromedia Certified Developer
    http://www.511th.com/
  • Re: vb version via conversion tools

    09-03-2006, 10:38 AM
    • Member
      215 point Member
    • angel eyes
    • Member since 11-25-2005, 1:22 AM
    • Posts 43

    Did you mean line 115?

    That one already is like that. I don't understand it, Webdev511.

Page 1 of 1 (4 items)