views:

159

answers:

1

I have sub classed a asp repeater similar to A Grouping Repeater All works fine apart from if I also have a <HeaderTemplate> </HeaderTemplate> The grouping template is rendered before the header template.

I would really like to either be able to choose the order in which the templates are rendered or just have the <GroupTemplate> Rendered after the header.

A: 

Did you try the simplier one? we cant evaluate you bug, if we cant see the code that you re running. Please post examples.

The simplier one from the comments:

using System;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;


    /// <summary> 
    /// This wraps the Web Repeater class and adds grouping capabilities.
    /// </summary> 
    public class GroupingRepeater : Repeater
    {

        private string _lastGroup;
        private string _groupColumn;
        private ITemplate _groupTemplate;

        /// <summary> 
        /// Gets or sets the column to group by.
        /// </summary> 
        [Browsable(true), Category("Behaviour")]
        public string GroupColumn
        {
            get { return _groupColumn; }
            set { _groupColumn = value; }
        }

        /// <summary> 
        /// Gets or sets the template used for Grouping.
        /// </summary> 
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [Browsable(false)]
        [TemplateContainer(typeof(RepeaterItem))]
        [DefaultValue("")]
        public virtual ITemplate GroupTemplate
        {
            get { return _groupTemplate; }
            set { _groupTemplate = value; }
        }

        /// <summary> 
        /// Default constructor.
        /// </summary> 
        public GroupingRepeater()
        {
            _lastGroup = null;
        }

        /// <summary> 
        /// Called when an item is created.
        /// </summary> 
        /// <param name="e"></param> 
        protected override void OnItemCreated(RepeaterItemEventArgs e)
        {
            base.OnItemCreated(e);

            if (!string.IsNullOrEmpty(GroupColumn))
            {
                string currentGroup = e.Item.DataItem.GetType().GetProperty(GroupColumn).GetValue(e.Item.DataItem, null).ToString();
                if (_lastGroup == null || _lastGroup != currentGroup)
                {
                    RepeaterItem item = new RepeaterItem(0, ListItemType.Item);

                    GroupTemplate.InstantiateIn(item);
                    item.DataItem = e.Item.DataItem;
                    this.Controls.Add(item);
                    item.DataBind();

                    _lastGroup = currentGroup;
                }
            }
        }

    }
Glennular
Yes it is based on that code. After a rebuild the templates came out in the correct order but this code has problems with postback events.There are also problems with getting button events in buttons that are in anything other than the first group.Gone done the nested repeater route now
HadleyHope