DataGrid.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / xsp / System / Web / UI / WebControls / DataGrid.cs / 1 / DataGrid.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Web.UI.WebControls { 
 
    using System;
    using System.Collections; 
    using System.Globalization;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Drawing; 
    using System.Drawing.Design;
    using System.Reflection; 
    using System.Web; 
    using System.Web.UI;
    using System.Security.Permissions; 
    using System.Web.Util;


    ///  
    ///    
    ///       Displays data from a data source in a tabular grid. The data source 
    ///       is any object that implements IEnumerable, which includes ADO.NET data, 
    ///       arrays, ArrayLists etc.
    ///     
    /// 
    [
    Editor("System.Web.UI.Design.WebControls.DataGridComponentEditor, " + AssemblyRef.SystemDesign, typeof(ComponentEditor)),
    Designer("System.Web.UI.Design.WebControls.DataGridDesigner, " + AssemblyRef.SystemDesign) 
    ]
    [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] 
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] 
    public class DataGrid : BaseDataList, INamingContainer {
 
        private static readonly object EventCancelCommand = new object();
        private static readonly object EventDeleteCommand = new object();
        private static readonly object EventEditCommand = new object();
        private static readonly object EventItemCommand = new object(); 
        private static readonly object EventItemCreated = new object();
        private static readonly object EventItemDataBound = new object(); 
        private static readonly object EventPageIndexChanged = new object(); 
        private static readonly object EventSortCommand = new object();
        private static readonly object EventUpdateCommand = new object(); 



        ///  
        ///  Specifies the  command. This field is constant.
        ///  
        public const string SortCommandName = "Sort"; 

        ///  
        ///  Specifies the  command. This field is constant.
        /// 
        public const string SelectCommandName = "Select";
 
        /// 
        ///  Specifies the  command. This field is constant. 
        ///  
        public const string EditCommandName = "Edit";
 
        /// 
        ///  Specifies the  command. This field is constant.
        /// 
        public const string DeleteCommandName = "Delete"; 

        ///  
        ///  Specifies the  command. This field is constant. 
        /// 
        public const string UpdateCommandName = "Update"; 

        /// 
        ///  Specifies the  command. This field is constant.
        ///  
        public const string CancelCommandName = "Cancel";
 
        ///  
        ///  Specifies the  command. This field is constant.
        ///  
        public const string PageCommandName = "Page";

        /// 
        ///  Specifies the  argument. This field is constant. 
        /// 
        public const string NextPageCommandArgument = "Next"; 
 
        /// 
        ///  Specifies the  argument. This field is constant. 
        /// 
        public const string PrevPageCommandArgument = "Prev";

        internal const string DataSourceItemCountViewStateKey = "_!DataSourceItemCount"; 

        private IEnumerator storedData; 
        private object firstDataItem; 
        private bool storedDataValid;
        private PagedDataSource pagedDataSource; 

        private ArrayList columns;
        private DataGridColumnCollection columnCollection;
 
        private TableItemStyle headerStyle;
        private TableItemStyle footerStyle; 
        private TableItemStyle itemStyle; 
        private TableItemStyle alternatingItemStyle;
        private TableItemStyle selectedItemStyle; 
        private TableItemStyle editItemStyle;
        private DataGridPagerStyle pagerStyle;

        private ArrayList itemsArray; 
        private DataGridItemCollection itemsCollection;
 
        private ArrayList autoGenColumnsArray; 

 
        /// 
        ///    
        ///       Initializes a new instance of the  class.
        ///     
        /// 
        public DataGrid() { 
        } 

 

        /// 
        ///    Gets or sets a value that indicates whether custom paging is allowed.
        ///  
        [
        WebCategory("Paging"), 
        DefaultValue(false), 
        WebSysDescription(SR.DataGrid_AllowCustomPaging)
        ] 
        public virtual bool AllowCustomPaging {
            get {
                object o = ViewState["AllowCustomPaging"];
                if (o != null) 
                    return(bool)o;
                return false; 
            } 
            set {
                ViewState["AllowCustomPaging"] = value; 
            }
        }

 
        /// 
        ///    Gets or sets a value that indicates whether paging is allowed. 
        ///  
        [
        WebCategory("Paging"), 
        DefaultValue(false),
        WebSysDescription(SR.DataGrid_AllowPaging)
        ]
        public virtual bool AllowPaging { 
            get {
                object o = ViewState["AllowPaging"]; 
                if (o != null) 
                    return(bool)o;
                return false; 
            }
            set {
                ViewState["AllowPaging"] = value;
            } 
        }
 
 
        /// 
        ///    Gets or sets a value that indicates whether sorting is allowed. 
        /// 
        [
        WebCategory("Behavior"),
        DefaultValue(false), 
        WebSysDescription(SR.DataGrid_AllowSorting)
        ] 
        public virtual bool AllowSorting { 
            get {
                object o = ViewState["AllowSorting"]; 
                if (o != null)
                    return(bool)o;
                return false;
            } 
            set {
                ViewState["AllowSorting"] = value; 
            } 
        }
 

        /// 
        ///    Gets the style properties for alternating items in the
        ///    . This 
        ///       property is read-only. 
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_AlternatingItemStyle)
        ] 
        public virtual TableItemStyle AlternatingItemStyle {
            get { 
                if (alternatingItemStyle == null) { 
                    alternatingItemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)alternatingItemStyle).TrackViewState();
                }
                return alternatingItemStyle;
            } 
        }
 
 
        /// 
        ///    Gets or sets a value that indicates whether columns will automatically 
        ///       be created for each bound data field.
        /// 
        [
        WebCategory("Behavior"), 
        DefaultValue(true),
        WebSysDescription(SR.DataControls_AutoGenerateColumns) 
        ] 
        public virtual bool AutoGenerateColumns {
            get { 
                object o = ViewState["AutoGenerateColumns"];
                if (o != null)
                    return(bool)o;
                return true; 
            }
            set { 
                ViewState["AutoGenerateColumns"] = value; 
            }
        } 


        /// 
        ///    Gets or sets the URL of an image to display in the 
        ///       background of the .
        ///  
        [ 
        WebCategory("Appearance"),
        DefaultValue(""), 
        Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
        UrlProperty(),
        WebSysDescription(SR.WebControl_BackImageUrl)
        ] 
        public virtual string BackImageUrl {
            get { 
                if (ControlStyleCreated == false) { 
                    return String.Empty;
                } 
                return ((TableStyle)ControlStyle).BackImageUrl;
            }
            set {
                ((TableStyle)ControlStyle).BackImageUrl = value; 
            }
        } 
 

        ///  
        ///    Gets or sets the ordinal index of the currently displayed page. 
        /// 
        [
        Browsable(false), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_CurrentPageIndex) 
        ] 
        public int CurrentPageIndex {
            get { 
                object o = ViewState["CurrentPageIndex"];
                if (o != null)
                    return(int)o;
                return 0; 
            }
            set { 
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("value");
                } 
                ViewState["CurrentPageIndex"] = value;
            }
        }
 

 
        ///  
        /// Gets a collection of  controls in the . This property is read-only.
        ///  
        [
        DefaultValue(null),
        Editor("System.Web.UI.Design.WebControls.DataGridColumnCollectionEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
        MergableProperty(false), 
        PersistenceMode(PersistenceMode.InnerProperty),
        WebCategory("Default"), 
        WebSysDescription(SR.DataControls_Columns) 
        ]
        public virtual DataGridColumnCollection Columns { 
            get {
                if (columnCollection == null) {
                    columns = new ArrayList();
                    columnCollection = new DataGridColumnCollection(this, columns); 
                    if (IsTrackingViewState)
                        ((IStateManager)columnCollection).TrackViewState(); 
                } 
                return columnCollection;
            } 
        }

        /// 
        ///    Gets or sets the ordinal index of the item to be edited. 
        /// 
        [ 
        WebCategory("Default"), 
        DefaultValue(-1),
        WebSysDescription(SR.DataGrid_EditItemIndex) 
        ]
        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; 
            }
        } 
 

        ///  
        ///    Gets the style properties of the item to be edited. This property is read-only.
        /// 
        [
        WebCategory("Styles"), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        NotifyParentProperty(true), 
        PersistenceMode(PersistenceMode.InnerProperty), 
        WebSysDescription(SR.DataGrid_EditItemStyle)
        ] 
        public virtual TableItemStyle EditItemStyle {
            get {
                if (editItemStyle == null) {
                    editItemStyle = new TableItemStyle(); 
                    if (IsTrackingViewState)
                        ((IStateManager)editItemStyle).TrackViewState(); 
                } 
                return editItemStyle;
            } 
        }


        ///  
        ///    Gets the style properties of the footer item. This property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DefaultValue(null), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataControls_FooterStyle), 
        ]
        public virtual TableItemStyle FooterStyle { 
            get { 
                if (footerStyle == null) {
                    footerStyle = new TableItemStyle(); 
                    if (IsTrackingViewState)
                        ((IStateManager)footerStyle).TrackViewState();
                }
                return footerStyle; 
            }
        } 
 

        ///  
        ///    Gets the style properties of the header item. This property is read-only.
        /// 
        [
        WebCategory("Styles"), 
        DefaultValue(null),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true), 
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataControls_HeaderStyle) 
        ]
        public virtual TableItemStyle HeaderStyle {
            get {
                if (headerStyle == null) { 
                    headerStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)headerStyle).TrackViewState(); 
                }
                return headerStyle; 
            }
        }

 
        /// 
        /// Gets a collection of  objects representing the individual 
        ///    items within the control. 
        ///    This property is read-only.
        ///  
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_Items) 
        ]
        public virtual DataGridItemCollection Items { 
            get { 
                if (itemsCollection == null) {
                    if (itemsArray == null) { 
                        EnsureChildControls();
                    }
                    if (itemsArray == null) {
                        itemsArray = new ArrayList(); 
                    }
                    itemsCollection = new DataGridItemCollection(itemsArray); 
                } 
                return itemsCollection;
            } 
        }


        ///  
        ///    Gets the style properties of the individual items. This property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_ItemStyle),
        ] 
        public virtual TableItemStyle ItemStyle {
            get { 
                if (itemStyle == null) { 
                    itemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)itemStyle).TrackViewState();
                }
                return itemStyle;
            } 
        }
 
 
        /// 
        ///    Gets the total number of pages to be displayed. This property is read-only. 
        /// 
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        WebSysDescription(SR.DataGrid_PageCount)
        ] 
        public int PageCount { 
            get {
                if (pagedDataSource != null) { 
                    return pagedDataSource.PageCount;
                }
                else {
                    object o = ViewState["PageCount"]; 
                    return (o != null) ? (int)o : 0;
                } 
            } 
        }
 

        /// 
        ///    Gets the style properties of the pager buttons for the
        ///    . This 
        ///       property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_PagerStyle)
        ] 
        public virtual DataGridPagerStyle PagerStyle {
            get { 
                if (pagerStyle == null) { 
                    pagerStyle = new DataGridPagerStyle(this);
                    if (IsTrackingViewState) 
                        ((IStateManager)pagerStyle).TrackViewState();
                }
                return pagerStyle;
            } 
        }
 
 
        /// 
        ///    Gets or sets the number of items to display on a single page. 
        /// 
        [
        WebCategory("Paging"),
        DefaultValue(10), 
        WebSysDescription(SR.DataGrid_PageSize),
        ] 
        public virtual int PageSize { 
            get {
                object o = ViewState["PageSize"]; 
                if (o != null)
                    return(int)o;
                return 10;
            } 
            set {
                if (value < 1) { 
                    throw new ArgumentOutOfRangeException("value"); 
                }
                ViewState["PageSize"] = value; 
            }
        }

 
        /// 
        ///    Gets or sets the index of the currently selected item. 
        ///  
        [
        Bindable(true), 
        DefaultValue(-1),
        WebSysDescription(SR.WebControl_SelectedIndex)
        ]
        public virtual int SelectedIndex { 
            get {
                object o = ViewState["SelectedIndex"]; 
                if (o != null) 
                    return(int)o;
                return -1; 
            }
            set {
                if (value < -1) {
                    throw new ArgumentOutOfRangeException("value"); 
                }
                int oldSelectedIndex = SelectedIndex; 
                ViewState["SelectedIndex"] = value; 

                if (itemsArray != null) { 
                    DataGridItem item;

                    if ((oldSelectedIndex != -1) && (itemsArray.Count > oldSelectedIndex)) {
                        item = (DataGridItem)itemsArray[oldSelectedIndex]; 

                        if (item.ItemType != ListItemType.EditItem) { 
                            ListItemType itemType = ListItemType.Item; 
                            if (oldSelectedIndex % 2 != 0)
                                itemType = ListItemType.AlternatingItem; 
                            item.SetItemType(itemType);
                        }
                    }
                    if ((value != -1) && (itemsArray.Count > value)) { 
                        item = (DataGridItem)itemsArray[value];
                        if (item.ItemType != ListItemType.EditItem) 
                            item.SetItemType(ListItemType.SelectedItem); 
                    }
                } 
            }
        }

 
        /// 
        /// Gets the selected item in the . This property is read-only. 
        ///  
        [
        Browsable(false), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_SelectedItem)
        ]
        public virtual DataGridItem SelectedItem { 
            get {
                int index = SelectedIndex; 
                DataGridItem item = null; 

                if (index != -1) { 
                    item = Items[index];
                }
                return item;
            } 
        }
 
 
        /// 
        ///    Gets the style properties of the currently selected item. This property is read-only. 
        /// 
        [
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty), 
        WebSysDescription(SR.DataGrid_SelectedItemStyle) 
        ]
        public virtual TableItemStyle SelectedItemStyle { 
            get {
                if (selectedItemStyle == null) {
                    selectedItemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)selectedItemStyle).TrackViewState();
                } 
                return selectedItemStyle; 
            }
        } 


        /// 
        ///    Gets or sets a value that specifies whether the footer is displayed in the 
        ///    .
        ///  
        [ 
        WebCategory("Appearance"),
        DefaultValue(false), 
        WebSysDescription(SR.DataControls_ShowFooter)
        ]
        public virtual bool ShowFooter {
            get { 
                object o = ViewState["ShowFooter"];
                if (o != null) 
                    return(bool)o; 
                return false;
            } 
            set {
                ViewState["ShowFooter"] = value;
            }
        } 

 
        ///  
        ///    Gets or sets a value that specifies whether the header is displayed in the
        ///    . 
        /// 
        [
        WebCategory("Appearance"),
        DefaultValue(true), 
        WebSysDescription(SR.DataControls_ShowHeader)
        ] 
        public virtual bool ShowHeader { 
            get {
                object o = ViewState["ShowHeader"]; 
                if (o != null)
                    return(bool)o;
                return true;
            } 
            set {
                ViewState["ShowHeader"] = value; 
            } 
        }
        protected override HtmlTextWriterTag TagKey { 
            get {
                return HtmlTextWriterTag.Table;
            }
        } 

 
        ///  
        ///    Gets or sets the number of rows to display in the
        /// . 
        /// 
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        WebSysDescription(SR.DataGrid_VisibleItemCount)
        ] 
        public virtual int VirtualItemCount { 
            get {
                object o = ViewState["VirtualItemCount"]; 
                if (o != null)
                    return(int)o;
                return 0;
            } 
            set {
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("value"); 
                }
                ViewState["VirtualItemCount"] = value; 
            }
        }

 

 
        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of 
        /// .
        /// 
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnCancelCommand)
        ] 
        public event DataGridCommandEventHandler CancelCommand { 
            add {
                Events.AddHandler(EventCancelCommand, value); 
            }
            remove {
                Events.RemoveHandler(EventCancelCommand, value);
            } 
        }
 
 

        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of .
        /// 
        [ 
        WebCategory("Action"),
        WebSysDescription(SR.DataGrid_OnDeleteCommand) 
        ] 
        public event DataGridCommandEventHandler DeleteCommand {
            add { 
                Events.AddHandler(EventDeleteCommand, value);
            }
            remove {
                Events.RemoveHandler(EventDeleteCommand, value); 
            }
        } 
 

 
        /// 
        /// Occurs when a control bubbles an event to the  with a
        ///  property of
        /// . 
        /// 
        [ 
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnEditCommand)
        ] 
        public event DataGridCommandEventHandler EditCommand {
            add {
                Events.AddHandler(EventEditCommand, value);
            } 
            remove {
                Events.RemoveHandler(EventEditCommand, value); 
            } 
        }
 


        /// 
        /// Occurs when a control bubbles an event to the  not covered by 
        /// , ,  or
        /// . 
        ///  
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnItemCommand)
        ]
        public event DataGridCommandEventHandler ItemCommand {
            add { 
                Events.AddHandler(EventItemCommand, value);
            } 
            remove { 
                Events.RemoveHandler(EventItemCommand, value);
            } 
        }


 
        /// 
        ///    Occurs on the server when a control a created. 
        ///  
        [
        WebCategory("Behavior"), 
        WebSysDescription(SR.DataControls_OnItemCreated)
        ]
        public event DataGridItemEventHandler ItemCreated {
            add { 
                Events.AddHandler(EventItemCreated, value);
            } 
            remove { 
                Events.RemoveHandler(EventItemCreated, value);
            } 
        }


        ///  
        ///    Occurs when an item is data bound to the control.
        ///  
        [ 
        WebCategory("Behavior"),
        WebSysDescription(SR.DataControls_OnItemDataBound) 
        ]
        public event DataGridItemEventHandler ItemDataBound {
            add {
                Events.AddHandler(EventItemDataBound, value); 
            }
            remove { 
                Events.RemoveHandler(EventItemDataBound, value); 
            }
        } 


        /// 
        ///    Occurs the one of the pager buttons is clicked. 
        /// 
        [ 
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnPageIndexChanged)
        ] 
        public event DataGridPageChangedEventHandler PageIndexChanged {
            add {
                Events.AddHandler(EventPageIndexChanged, value);
            } 
            remove {
                Events.RemoveHandler(EventPageIndexChanged, value); 
            } 
        }
 



        ///  
        ///    Occurs when a column is sorted.
        ///  
        [ 
        WebCategory("Action"),
        WebSysDescription(SR.DataGrid_OnSortCommand) 
        ]
        public event DataGridSortCommandEventHandler SortCommand {
            add {
                Events.AddHandler(EventSortCommand, value); 
            }
            remove { 
                Events.RemoveHandler(EventSortCommand, value); 
            }
        } 



        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of . 
        ///  
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnUpdateCommand)
        ]
        public event DataGridCommandEventHandler UpdateCommand {
            add { 
                Events.AddHandler(EventUpdateCommand, value);
            } 
            remove { 
                Events.RemoveHandler(EventUpdateCommand, value);
            } 
        }


        ///  
        /// 
        ///  Caches the fact that we have already consumed the first item from the enumeration 
        ///  and must use it first during our item creation. 
        /// 
        internal void StoreEnumerator(IEnumerator dataSource, object firstDataItem) { 
            this.storedData = dataSource;
            this.firstDataItem = firstDataItem;

            this.storedDataValid = true; 
        }
 
 
        /// 
        ///  
        private ArrayList CreateAutoGeneratedColumns(PagedDataSource dataSource) {
            if (dataSource == null) {
                // note that we're not throwing an exception in this case, and the calling
                // code should be able to handle a null arraylist being returned 
                return null;
            } 
 
            ArrayList generatedColumns = new ArrayList();
            PropertyDescriptorCollection propDescs = null; 
            bool throwException = true;

            // try ITypedList first
            // A PagedDataSource implements this, but returns null, if the underlying data source 
            // does not implement it.
            propDescs = ((ITypedList)dataSource).GetItemProperties(new PropertyDescriptor[0]); 
 
            if (propDescs == null) {
                Type sampleItemType = null; 
                object sampleItem = null;

                IEnumerable realDataSource = dataSource.DataSource;
                Debug.Assert(realDataSource != null, "Must have a real data source when calling CreateAutoGeneratedColumns"); 

                Type dataSourceType = realDataSource.GetType(); 
 
                // try for a typed Item property, which should be present on strongly typed collections
                PropertyInfo itemProp = dataSourceType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance, null, null, new Type[] { typeof(int) }, null); 
                if (itemProp != null) {
                    sampleItemType = itemProp.PropertyType;
                }
 
                if ((sampleItemType == null) || (sampleItemType == typeof(object))) {
                    // last resort... try to get ahold of the first item by beginning the 
                    // enumeration 

                    IEnumerator e = dataSource.GetEnumerator(); 

                    if (e.MoveNext()) {
                        sampleItem = e.Current;
                    } 
                    else {
                        // we don't want to throw an exception if we're bound to an IEnumerable 
                        // data source with no records... we'll simply bail and not show any data 
                        throwException = false;
                    } 
                    if (sampleItem != null) {
                        sampleItemType = sampleItem.GetType();
                    }
 
                    // We must store the enumerator regardless of whether we got back an item from it
                    // because we cannot start the enumeration again, in the case of a DataReader. 
                    // Code in CreateControlHierarchy must deal appropriately for the case where 
                    // there is a stored enumerator, but a null object as the first item.
                    StoreEnumerator(e, sampleItem); 
                }

                if ((sampleItem != null) && (sampleItem is ICustomTypeDescriptor)) {
                    // Get the custom properties of the object 
                    propDescs = TypeDescriptor.GetProperties(sampleItem);
                } 
                else if (sampleItemType != null) { 
                    // directly bindable types: strings, ints etc. get treated special, since we
                    // don't care about their properties, but rather we care about them directly 
                    if (BaseDataList.IsBindableType(sampleItemType)) {
                        BoundColumn column = new BoundColumn();

                        ((IStateManager)column).TrackViewState(); 
                        column.HeaderText = "Item";
                        column.DataField = BoundColumn.thisExpr; 
                        column.SortExpression = "Item"; 

                        column.SetOwner(this); 
                        generatedColumns.Add(column);
                    }
                    else {
                        // complex type... we get its properties 
                        propDescs = TypeDescriptor.GetProperties(sampleItemType);
                    } 
                } 
            }
 
            if ((propDescs != null) && (propDescs.Count != 0)) {
                foreach (PropertyDescriptor pd in propDescs) {
                    Type propType = pd.PropertyType;
 
                    if (BaseDataList.IsBindableType(propType)) {
                        BoundColumn column = new BoundColumn(); 
 
                        ((IStateManager)column).TrackViewState();
                        column.HeaderText = pd.Name; 
                        column.DataField = pd.Name;
                        column.SortExpression = pd.Name;
                        column.ReadOnly = pd.IsReadOnly;
 
                        column.SetOwner(this);
                        generatedColumns.Add(column); 
                    } 
                }
            } 

            if ((generatedColumns.Count == 0) && throwException) {
                // this handles the case where we got back something that either had no
                // properties, or all properties were not bindable. 
                throw new HttpException(SR.GetString(SR.DataGrid_NoAutoGenColumns, ID));
            } 
 
            return generatedColumns;
        } 


        /// 
        ///   Creates the set of columns to be used to build up the control 
        ///   hierarchy.
        ///   When AutoGenerateColumns is true, the columns are created to match the 
        ///   datasource and are appended to the set of columns defined in the Columns 
        ///   collection.
        ///  
        protected virtual ArrayList CreateColumnSet(PagedDataSource dataSource, bool useDataSource) {
            ArrayList columnsArray = new ArrayList();

            DataGridColumn[] definedColumns = new DataGridColumn[Columns.Count]; 
            Columns.CopyTo(definedColumns, 0);
 
            int i; 

            for (i = 0; i < definedColumns.Length; i++) 
                columnsArray.Add(definedColumns[i]);

            if (AutoGenerateColumns == true) {
                ArrayList autoColumns = null; 
                if (useDataSource) {
                    autoColumns = CreateAutoGeneratedColumns(dataSource); 
                    autoGenColumnsArray = autoColumns; 
                }
                else { 
                    autoColumns = autoGenColumnsArray;
                }

                if (autoColumns != null) { 
                    int autoColumnCount = autoColumns.Count;
 
                    for (i = 0; i < autoColumnCount; i++) 
                        columnsArray.Add(autoColumns[i]);
                } 
            }

            return columnsArray;
        } 

 
        ///  
        /// 
        ///    Creates the control hierarchy that is used to render the DataGrid. 
        ///       This is called whenever a control hierarchy is needed and the
        ///       ChildControlsCreated property is false.
        ///       The implementation assumes that all the children in the controls
        ///       collection have already been cleared. 
        /// 
        protected override void CreateControlHierarchy(bool useDataSource) { 
            pagedDataSource = CreatePagedDataSource(); 

            IEnumerator dataSource = null; 
            int count = -1;
            int totalCount = -1;
            ArrayList keysArray = DataKeysArray;
            ArrayList columnsArray = null; 

            if (itemsArray != null) { 
                itemsArray.Clear(); 
            }
            else { 
                itemsArray = new ArrayList();
            }
            itemsCollection = null;
 
            if (useDataSource == false) {
                // ViewState must have a non-null value for ItemCount because we check for 
                // this in CreateChildControls 
                count = (int)ViewState[BaseDataList.ItemCountViewStateKey];
                totalCount = (int)ViewState[DataSourceItemCountViewStateKey]; 

                if (count != -1) {
                    if (pagedDataSource.IsCustomPagingEnabled) {
                        pagedDataSource.DataSource = new DummyDataSource(count); 
                    }
                    else { 
                        pagedDataSource.DataSource = new DummyDataSource(totalCount); 
                    }
                    dataSource = pagedDataSource.GetEnumerator(); 
                    columnsArray = CreateColumnSet(null, false);

                    itemsArray.Capacity = count;
                } 
            }
            else { 
                keysArray.Clear(); 

                IEnumerable realDataSource = GetData(); 

                if (realDataSource != null) {
                    ICollection collection = realDataSource as ICollection;
 
                    if ((collection == null) &&
                        pagedDataSource.IsPagingEnabled && !pagedDataSource.IsCustomPagingEnabled) { 
                        throw new HttpException(SR.GetString(SR.DataGrid_Missing_VirtualItemCount, ID)); 
                    }
 
                    pagedDataSource.DataSource = realDataSource;
                    if (pagedDataSource.IsPagingEnabled) {
                        if ((pagedDataSource.CurrentPageIndex < 0) || (pagedDataSource.CurrentPageIndex >= pagedDataSource.PageCount)) {
                            throw new HttpException(SR.GetString(SR.Invalid_CurrentPageIndex)); 
                        }
                    } 
                    columnsArray = CreateColumnSet(pagedDataSource, useDataSource); 

                    if (storedDataValid) { 
                        dataSource = storedData;
                    }
                    else {
                        dataSource = pagedDataSource.GetEnumerator(); 
                    }
 
                    if (collection != null) { 
                        int initialCapacity = pagedDataSource.Count;
                        keysArray.Capacity = initialCapacity; 
                        itemsArray.Capacity = initialCapacity;
                    }
                }
            } 

            int columnCount = 0; 
            if (columnsArray != null) 
                columnCount = columnsArray.Count;
 
            if (columnCount > 0) {
                DataGridColumn[] displayColumns = new DataGridColumn[columnCount];
                columnsArray.CopyTo(displayColumns, 0);
 
                Table table = new ChildTable(String.IsNullOrEmpty(ID) ? null : ClientID);
                Controls.Add(table); 
 
                for (int c = 0; c < displayColumns.Length; c++) {
                    displayColumns[c].Initialize(); 
                }

                TableRowCollection rows = table.Rows;
                DataGridItem item; 
                ListItemType itemType;
                int index = 0; 
                int dataSetIndex = 0; 

                string keyField = DataKeyField; 
                bool storeKeys = (useDataSource && (keyField.Length != 0));
                bool createPager = pagedDataSource.IsPagingEnabled;
                int editItemIndex = EditItemIndex;
                int selectedItemIndex = SelectedIndex; 

                if (pagedDataSource.IsPagingEnabled) 
                    dataSetIndex = pagedDataSource.FirstIndexInPage; 

                count = 0; 

                if (createPager) {
                    // top pager
                    CreateItem(-1, -1, ListItemType.Pager, false, null, displayColumns, rows, pagedDataSource); 
                }
 
                CreateItem(-1, -1, ListItemType.Header, useDataSource, null, displayColumns, rows, null); 

                if (storedDataValid && (firstDataItem != null)) { 
                    if (storeKeys) {
                        object keyValue = DataBinder.GetPropertyValue(firstDataItem, keyField);
                        keysArray.Add(keyValue);
                    } 

                    itemType = ListItemType.Item; 
                    if (index == editItemIndex) 
                        itemType = ListItemType.EditItem;
                    else if (index == selectedItemIndex) 
                        itemType = ListItemType.SelectedItem;

                    item = CreateItem(0, dataSetIndex, itemType, useDataSource, firstDataItem, displayColumns, rows, null);
                    itemsArray.Add(item); 

                    count++; 
                    index++; 
                    dataSetIndex++;
 
                    storedDataValid = false;
                    firstDataItem = null;
                }
 
                while (dataSource.MoveNext()) {
                    object dataItem = dataSource.Current; 
 
                    if (storeKeys) {
                        object keyValue = DataBinder.GetPropertyValue(dataItem, keyField); 
                        keysArray.Add(keyValue);
                    }

                    itemType = ListItemType.Item; 

                    if (index == editItemIndex) 
                        itemType = ListItemType.EditItem; 
                    else if (index == selectedItemIndex)
                        itemType = ListItemType.SelectedItem; 
                    else if (index % 2 != 0) {
                        itemType = ListItemType.AlternatingItem;
                    }
 
                    item = CreateItem(index, dataSetIndex, itemType, useDataSource, dataItem, displayColumns, rows, null);
                    itemsArray.Add(item); 
 
                    count++;
                    dataSetIndex++; 
                    index++;
                }

                CreateItem(-1, -1, ListItemType.Footer, useDataSource, null, displayColumns, rows, null); 

                if (createPager) { 
                    // bottom pager 
                    CreateItem(-1, -1, ListItemType.Pager, false, null, displayColumns, rows, pagedDataSource);
                } 
            }

            if (useDataSource) {
                // save the number of items and pages contained in the DataGrid for use in round-trips 
                if (dataSource != null) {
                    ViewState[BaseDataList.ItemCountViewStateKey] = count; 
                    if (pagedDataSource.IsPagingEnabled) { 
                        ViewState["PageCount"] = pagedDataSource.PageCount;
                        ViewState[DataSourceItemCountViewStateKey] = pagedDataSource.DataSourceCount; 
                    }
                    else {
                        ViewState["PageCount"] = 1;
                        ViewState[DataSourceItemCountViewStateKey] = count; 
                    }
                } 
                else { 
                    ViewState[BaseDataList.ItemCountViewStateKey] = -1;
                    ViewState[DataSourceItemCountViewStateKey] = -1; 
                    ViewState["PageCount"] = 0;
                }
            }
 
            pagedDataSource = null;
        } 
 

        ///  
        /// 
        ///    Creates new control style.
        /// 
        protected override Style CreateControlStyle() { 
            TableStyle controlStyle = new TableStyle();
 
            // initialize defaults that are different from TableStyle 
            controlStyle.GridLines = GridLines.Both;
            controlStyle.CellSpacing = 0; 

            return controlStyle;
        }
 
        private DataGridItem CreateItem(int itemIndex, int dataSourceIndex, ListItemType itemType, bool dataBind, object dataItem, DataGridColumn[] columns, TableRowCollection rows, PagedDataSource pagedDataSource) {
            DataGridItem item = CreateItem(itemIndex, dataSourceIndex, itemType); 
            DataGridItemEventArgs e = new DataGridItemEventArgs(item); 

            if (itemType != ListItemType.Pager) { 
                InitializeItem(item, columns);
                if (dataBind) {
                    item.DataItem = dataItem;
                } 
                OnItemCreated(e);
                rows.Add(item); 
 
                if (dataBind) {
                    item.DataBind(); 
                    OnItemDataBound(e);

                    item.DataItem = null;
                } 
            }
            else { 
                InitializePager(item, columns.Length, pagedDataSource); 
                OnItemCreated(e);
                rows.Add(item); 
            }

            return item;
        } 

 
        ///  
        ///    [To be supplied.]
        ///  
        protected virtual DataGridItem CreateItem(int itemIndex, int dataSourceIndex, ListItemType itemType) {
            return new DataGridItem(itemIndex, dataSourceIndex, itemType);
        }
 
        private PagedDataSource CreatePagedDataSource() {
            PagedDataSource pagedDataSource = new PagedDataSource(); 
 
            pagedDataSource.CurrentPageIndex = CurrentPageIndex;
            pagedDataSource.PageSize = PageSize; 
            pagedDataSource.AllowPaging = AllowPaging;
            pagedDataSource.AllowCustomPaging = AllowCustomPaging;
            pagedDataSource.VirtualCount = VirtualItemCount;
 
            return pagedDataSource;
        } 
 

        ///  
        ///    [To be supplied.]
        /// 
        protected virtual void InitializeItem(DataGridItem item, DataGridColumn[] columns) {
            TableCellCollection cells = item.Cells; 

            for (int i = 0; i < columns.Length; i++) { 
                TableCell cell; 
                if ((item.ItemType == ListItemType.Header) && UseAccessibleHeader) {
                    cell = new TableHeaderCell(); 
                    cell.Attributes["scope"] = "col";
                }
                else {
                    cell = new TableCell(); 
                }
 
                columns[i].InitializeCell(cell, i, item.ItemType); 
                cells.Add(cell);
            } 
        }


        ///  
        ///    
        ///   Creates a DataGridItem that contains the paging UI. 
        ///   The paging UI is a navigation bar that is a built into a single TableCell that 
        ///   spans across all columns of the DataGrid.
        ///     
        /// 
        protected virtual void InitializePager(DataGridItem item, int columnSpan, PagedDataSource pagedDataSource) {
            TableCell cell = new TableCell();
            if (columnSpan > 1) { 
                cell.ColumnSpan = columnSpan;
            } 
 
            DataGridPagerStyle pagerStyle = PagerStyle;
 
            if (pagerStyle.Mode == PagerMode.NextPrev) {
                if (pagedDataSource.IsFirstPage == false) {
                    LinkButton prevButton = new DataGridLinkButton();
                    prevButton.Text = pagerStyle.PrevPageText; 
                    prevButton.CommandName = DataGrid.PageCommandName;
                    prevButton.CommandArgument = DataGrid.PrevPageCommandArgument; 
                    prevButton.CausesValidation = false; 
                    cell.Controls.Add(prevButton);
                } 
                else {
                    Label prevLabel = new Label();
                    prevLabel.Text = pagerStyle.PrevPageText;
                    cell.Controls.Add(prevLabel); 
                }
 
                cell.Controls.Add(new LiteralControl(" ")); 

                if (pagedDataSource.IsLastPage == false) { 
                    LinkButton nextButton = new DataGridLinkButton();
                    nextButton.Text = pagerStyle.NextPageText;
                    nextButton.CommandName = DataGrid.PageCommandName;
                    nextButton.CommandArgument = DataGrid.NextPageCommandArgument; 
                    nextButton.CausesValidation = false;
                    cell.Controls.Add(nextButton); 
                } 
                else {
                    Label nextLabel = new Label(); 
                    nextLabel.Text = pagerStyle.NextPageText;
                    cell.Controls.Add(nextLabel);
                }
            } 
            else {
                int pages = pagedDataSource.PageCount; 
                int currentPage = pagedDataSource.CurrentPageIndex + 1; 
                int pageSetSize = pagerStyle.PageButtonCount;
                int pagesShown = pageSetSize; 

                // ensure the number of pages we show isn't more than the number of pages that do exist
                if (pages < pagesShown)
                    pagesShown = pages; 

                // initialze to the first page set, i.e., pages 1 through number of pages shown 
                int firstPage = 1; 
                int lastPage = pagesShown;
 
                if (currentPage > lastPage) {
                    // The current page is not in the first page set, then we need to slide the
                    // range of pages shown by adjusting firstPage and lastPage
                    int currentPageSet = pagedDataSource.CurrentPageIndex / pageSetSize; 
                    firstPage = currentPageSet * pageSetSize + 1;
                    lastPage = firstPage + pageSetSize - 1; 
 
                    // now bring back lastPage into the range if its exceeded the number of pages
                    if (lastPage > pages) 
                        lastPage = pages;

                    // if theres room to show more pages from the previous page set, then adjust
                    // the first page accordingly 
                    if (lastPage - firstPage + 1 < pageSetSize) {
                        firstPage = Math.Max(1, lastPage - pageSetSize + 1); 
                    } 
                }
 
                LinkButton button;

                if (firstPage != 1) {
                    button = new DataGridLinkButton(); 

                    button.Text = "..."; 
                    button.CommandName = DataGrid.PageCommandName; 
                    button.CommandArgument = (firstPage - 1).ToString(NumberFormatInfo.InvariantInfo);
                    button.CausesValidation = false; 
                    cell.Controls.Add(button);

                    cell.Controls.Add(new LiteralControl(" "));
                } 

                for (int i = firstPage; i <= lastPage; i++) { 
                    string pageString = (i).ToString(NumberFormatInfo.InvariantInfo); 
                    if (i == currentPage) {
                        Label label = new Label(); 

                        label.Text = pageString;
                        cell.Controls.Add(label);
                    } 
                    else {
                        button = new DataGridLinkButton(); 
 
                        button.Text = pageString;
                        button.CommandName = DataGrid.PageCommandName; 
                        button.CommandArgument = pageString;
                        button.CausesValidation = false;
                        cell.Controls.Add(button);
                    } 

                    if (i < lastPage) { 
                        cell.Controls.Add(new LiteralControl(" ")); 
                    }
                } 

                if (pages > lastPage) {
                    cell.Controls.Add(new LiteralControl(" "));
 
                    button = new DataGridLinkButton();
 
                    button.Text = "..."; 
                    button.CommandName = DataGrid.PageCommandName;
                    button.CommandArgument = (lastPage + 1).ToString(NumberFormatInfo.InvariantInfo); 
                    button.CausesValidation = false;
                    cell.Controls.Add(button);
                }
            } 

            item.Cells.Add(cell); 
        } 

 
        /// 
        /// 
        /// Loads a saved state of the .
        ///  
        protected override void LoadViewState(object savedState) {
            if (savedState != null) { 
                object[] myState = (object[])savedState; 

                if (myState[0] != null) 
                    base.LoadViewState(myState[0]);
                if (myState[1] != null)
                    ((IStateManager)Columns).LoadViewState(myState[1]);
                if (myState[2] != null) 
                    ((IStateManager)PagerStyle).LoadViewState(myState[2]);
                if (myState[3] != null) 
                    ((IStateManager)HeaderStyle).LoadViewState(myState[3]); 
                if (myState[4] != null)
                    ((IStateManager)FooterStyle).LoadViewState(myState[4]); 
                if (myState[5] != null)
                    ((IStateManager)ItemStyle).LoadViewState(myState[5]);
                if (myState[6] != null)
                    ((IStateManager)AlternatingItemStyle).LoadViewState(myState[6]); 
                if (myState[7] != null)
                    ((IStateManager)SelectedItemStyle).LoadViewState(myState[7]); 
                if (myState[8] != null) 
                    ((IStateManager)EditItemStyle).LoadViewState(myState[8]);
                if (myState[9] != null) 
                    ((IStateManager)ControlStyle).LoadViewState(myState[9]);
                if (myState[10] != null) {
                    object[] autoGenColumnState = (object[])myState[10];
                    int columnCount = autoGenColumnState.Length; 

                    if (columnCount != 0) 
                        autoGenColumnsArray = new ArrayList(); 
                    else
                        autoGenColumnsArray = null; 

                    for (int i = 0; i < columnCount; i++) {
                        BoundColumn column = new BoundColumn();
 
                        ((IStateManager)column).TrackViewState();
                        ((IStateManager)column).LoadViewState(autoGenColumnState[i]); 
 
                        column.SetOwner(this);
                        autoGenColumnsArray.Add(column); 
                    }
                }
            }
        } 

 
        ///  
        /// 
        ///  
        protected override bool OnBubbleEvent(object source, EventArgs e) {
            bool handled = false;

            if (e is DataGridCommandEventArgs) { 
                DataGridCommandEventArgs dce = (DataGridCommandEventArgs)e;
 
                OnItemCommand(dce); 
                handled = true;
 
                string command = dce.CommandName;

                if (StringUtil.EqualsIgnoreCase(command, DataGrid.SelectCommandName)) {
                    SelectedIndex = dce.Item.ItemIndex; 
                    OnSelectedIndexChanged(EventArgs.Empty);
                } 
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.PageCommandName)) { 
                    string pageNumberArg = (string)dce.CommandArgument;
 
                    int newPage = CurrentPageIndex;

                    if (StringUtil.EqualsIgnoreCase(pageNumberArg, DataGrid.NextPageCommandArgument)) {
                        newPage++; 
                    }
                    else if (StringUtil.EqualsIgnoreCase(pageNumberArg, DataGrid.PrevPageCommandArgument)) { 
                        newPage--; 
                    }
                    else { 
                        // argument is page number, and page index is 1 less than that
                        newPage = Int32.Parse(pageNumberArg, CultureInfo.InvariantCulture) - 1;
                    }
 
                    DataGridPageChangedEventArgs args = new DataGridPageChangedEventArgs(source, newPage);
                    OnPageIndexChanged(args); 
                } 
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.SortCommandName)) {
                    DataGridSortCommandEventArgs args = new DataGridSortCommandEventArgs(source, dce); 
                    OnSortCommand(args);
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.EditCommandName)) {
                    OnEditCommand(dce); 
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.UpdateCommandName)) { 
                    OnUpdateCommand(dce); 
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.CancelCommandName)) { 
                    OnCancelCommand(dce);
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.DeleteCommandName)) {
                    OnDeleteCommand(dce); 
                }
            } 
 
            return handled;
        } 


        /// 
        ///  
        internal void OnColumnsChanged() {
            if (Initialized) { 
                RequiresDataBinding = true; 
            }
        } 


        /// 
        /// Raises the event. 
        /// 
        protected virtual void OnCancelCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventCancelCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnDeleteCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventDeleteCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnEditCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventEditCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventItemCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemCreated(DataGridItemEventArgs e) { 
            DataGridItemEventHandler handler = (DataGridItemEventHandler)Events[EventItemCreated]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemDataBound(DataGridItemEventArgs e) { 
            DataGridItemEventHandler handler = (DataGridItemEventHandler)Events[EventItemDataBound]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnPageIndexChanged(DataGridPageChangedEventArgs e) { 
            DataGridPageChangedEventHandler handler = (DataGridPageChangedEventHandler)Events[EventPageIndexChanged]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        ///  
        internal void OnPagerChanged() {
        } 
 

        ///  
        /// Raises the  event.
        /// 
        protected virtual void OnSortCommand(DataGridSortCommandEventArgs e) {
            DataGridSortCommandEventHandler handler = (DataGridSortCommandEventHandler)Events[EventSortCommand]; 
            if (handler != null) handler(this, e);
        } 
 

        ///  
        /// Raises the  event.
        /// 
        protected virtual void OnUpdateCommand(DataGridCommandEventArgs e) {
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventUpdateCommand]; 
            if (handler != null) handler(this, e);
        } 
 

        ///  
        /// 
        /// 
        protected internal override void PrepareControlHierarchy() {
            if (Controls.Count == 0) 
                return;
 
            Table childTable = (Table)Controls[0]; 
            childTable.CopyBaseAttributes(this);
            childTable.Caption = Caption; 
            childTable.CaptionAlign = CaptionAlign;
            if (ControlStyleCreated) {
                childTable.ApplyStyle(ControlStyle);
            } 
            else {
                // Since we didn't create a ControlStyle yet, the default 
                // settings for the default style of the control need to be applied 
                // to the child table control directly
                // 

                childTable.GridLines = GridLines.Both;
                childTable.CellSpacing = 0;
            } 

            TableRowCollection rows = childTable.Rows; 
            int rowCount = rows.Count; 

            if (rowCount == 0) 
                return;

            int columnCount = Columns.Count;
            DataGridColumn[] definedColumns = new DataGridColumn[columnCount]; 
            if (columnCount > 0)
                Columns.CopyTo(definedColumns, 0); 
 
            // the composite alternating item style, so we need to do just one
            // merge style on the actual item 
            Style altItemStyle = null;
            if (alternatingItemStyle != null) {
                altItemStyle = new TableItemStyle();
                altItemStyle.CopyFrom(itemStyle); 
                altItemStyle.CopyFrom(alternatingItemStyle);
            } 
            else { 
                altItemStyle = itemStyle;
            } 

            int visibleColumns = 0;
            bool calculateColumns = true;
            for (int i = 0; i < rowCount; i++) { 
                DataGridItem item = (DataGridItem)rows[i];
 
                switch (item.ItemType) { 
                    case ListItemType.Header:
                        if (ShowHeader == false) { 
                            item.Visible = false;
                            continue;   // with the next row
                        }
                        else { 
                            if (headerStyle != null) {
                                item.MergeStyle(headerStyle); 
                            } 
                        }
                        break; 

                    case ListItemType.Footer:
                        if (ShowFooter == false) {
                            item.Visible = false; 
                            continue;   // with the next row
                        } 
                        else { 
                            item.MergeStyle(footerStyle);
                        } 
                        break;

                    case ListItemType.Pager:
                        if (pagerStyle.Visible == false) { 
                            item.Visible = false;
                            continue;   // with the next row 
                        } 
                        else {
                            if (i == 0) { 
                                // top pager
                                if (pagerStyle.IsPagerOnTop == false) {
                                    item.Visible = false;
                                    continue; 
                                }
                            } 
                            else { 
                                // bottom pager
                                if (pagerStyle.IsPagerOnBottom == false) { 
                                    item.Visible = false;
                                    continue;
                                }
                            } 

                            item.MergeStyle(pagerStyle); 
                        } 
                        break;
 
                    case ListItemType.Item:
                        item.MergeStyle(itemStyle);
                        break;
 
                    case ListItemType.AlternatingItem:
                        item.MergeStyle(altItemStyle); 
                        break; 

                    case ListItemType.SelectedItem: 
                        // When creating the control hierarchy we first check if the
                        // item is in edit mode, so we know this item cannot be in edit
                        // mode. The only special characteristic of this item is that
                        // it is selected. 
                        {
                            Style s = new TableItemStyle(); 
 
                            if (item.ItemIndex % 2 != 0)
                                s.CopyFrom(altItemStyle); 
                            else
                                s.CopyFrom(itemStyle);
                            s.CopyFrom(selectedItemStyle);
                            item.MergeStyle(s); 
                        }
                        break; 
 
                    case ListItemType.EditItem:
                        // When creating the control hierarchy, we first check if the 
                        // item is in edit mode. So an item may be selected too, and
                        // so both editItemStyle (more specific) and selectedItemStyle
                        // are applied.
                        { 
                            Style s = new TableItemStyle();
 
                            if (item.ItemIndex % 2 != 0) 
                                s.CopyFrom(altItemStyle);
                            else 
                                s.CopyFrom(itemStyle);
                            if (item.ItemIndex == SelectedIndex)
                                s.CopyFrom(selectedItemStyle);
                            s.CopyFrom(editItemStyle); 
                            item.MergeStyle(s);
                        } 
                        break; 
                }
 
                TableCellCollection cells = item.Cells;
                int cellCount = cells.Count;

                if ((columnCount > 0) && (item.ItemType != ListItemType.Pager)) { 
                    int definedCells = cellCount;
 
                    if (columnCount < cellCount) 
                        definedCells = columnCount;
 
                    for (int j = 0; j < definedCells; j++) {
                        if (definedColumns[j].Visible == false) {
                            cells[j].Visible = false;
                        } 
                        else {
                            if (item.ItemType == ListItemType.Item && calculateColumns) { 
                                visibleColumns++; 
                            }
                            Style cellStyle = null; 

                            switch (item.ItemType) {
                                case ListItemType.Header:
                                    cellStyle = definedColumns[j].HeaderStyleInternal; 
                                    break;
                                case ListItemType.Footer: 
                                    cellStyle = definedColumns[j].FooterStyleInternal; 
                                    break;
                                default: 
                                    cellStyle = definedColumns[j].ItemStyleInternal;
                                    break;
                            }
                            cells[j].MergeStyle(cellStyle); 
                        }
                    } 
                    if (item.ItemType == ListItemType.Item) { 
                        calculateColumns = false;
                    } 
                }
            }
            if (Items.Count > 0 && visibleColumns != Items[0].Cells.Count && AllowPaging) {
                for (int i = 0; i < rowCount; i++) { 
                    DataGridItem item = (DataGridItem)rows[i];
                    if (item.ItemType == ListItemType.Pager && item.Cells.Count > 0) { 
                        item.Cells[0].ColumnSpan = visibleColumns; 
                    }
                } 
            }
        }

 
        /// 
        ///  
        /// Saves the current state of the . 
        /// 
        protected override object SaveViewState() { 
            object baseState = base.SaveViewState();
            object columnState = (columnCollection != null) ? ((IStateManager)columnCollection).SaveViewState() : null;
            object pagerStyleState = (pagerStyle != null) ? ((IStateManager)pagerStyle).SaveViewState() : null;
            object headerStyleState = (headerStyle != null) ? ((IStateManager)headerStyle).SaveViewState() : null; 
            object footerStyleState = (footerStyle != null) ? ((IStateManager)footerStyle).SaveViewState() : null;
            object itemStyleState = (itemStyle != null) ? ((IStateManager)itemStyle).SaveViewState() : null; 
            object alternatingItemStyleState = (alternatingItemStyle != null) ? ((IStateManager)alternatingItemStyle).SaveViewState() : null; 
            object selectedItemStyleState = (selectedItemStyle != null) ? ((IStateManager)selectedItemStyle).SaveViewState() : null;
            object editItemStyleState = (editItemStyle != null) ? ((IStateManager)editItemStyle).SaveViewState() : null; 
            object controlState = ControlStyleCreated ? ((IStateManager)ControlStyle).SaveViewState() : null;

            object[] autoGenColumnState = null;
 
            if ((autoGenColumnsArray != null) && (autoGenColumnsArray.Count != 0)) {
                autoGenColumnState = new object[autoGenColumnsArray.Count]; 
 
                for (int i = 0; i < autoGenColumnState.Length; i++) {
                    autoGenColumnState[i] = ((IStateManager)autoGenColumnsArray[i]).SaveViewState(); 
                }
            }

            object[] myState = new object[11]; 
            myState[0] = baseState;
            myState[1] = columnState; 
            myState[2] = pagerStyleState; 
            myState[3] = headerStyleState;
            myState[4] = footerStyleState; 
            myState[5] = itemStyleState;
            myState[6] = alternatingItemStyleState;
            myState[7] = selectedItemStyleState;
            myState[8] = editItemStyleState; 
            myState[9] = controlState;
            myState[10] = autoGenColumnState; 
 
            // note that we always have some state, atleast the ItemCount
            return myState; 
        }


        ///  
        /// 
        ///    Marks the starting point to begin tracking and saving changes to the 
        ///       control as part of the control viewstate. 
        /// 
        protected override void TrackViewState() { 
            base.TrackViewState();

            if (columnCollection != null)
                ((IStateManager)columnCollection).TrackViewState(); 
            if (pagerStyle != null)
                ((IStateManager)pagerStyle).TrackViewState(); 
            if (headerStyle != null) 
                ((IStateManager)headerStyle).TrackViewState();
            if (footerStyle != null) 
                ((IStateManager)footerStyle).TrackViewState();
            if (itemStyle != null)
                ((IStateManager)itemStyle).TrackViewState();
            if (alternatingItemStyle != null) 
                ((IStateManager)alternatingItemStyle).TrackViewState();
            if (selectedItemStyle != null) 
                ((IStateManager)selectedItemStyle).TrackViewState(); 
            if (editItemStyle != null)
                ((IStateManager)editItemStyle).TrackViewState(); 
            if (ControlStyleCreated)
                ((IStateManager)ControlStyle).TrackViewState();
        }
    } 
}
 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Web.UI.WebControls { 
 
    using System;
    using System.Collections; 
    using System.Globalization;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Drawing; 
    using System.Drawing.Design;
    using System.Reflection; 
    using System.Web; 
    using System.Web.UI;
    using System.Security.Permissions; 
    using System.Web.Util;


    ///  
    ///    
    ///       Displays data from a data source in a tabular grid. The data source 
    ///       is any object that implements IEnumerable, which includes ADO.NET data, 
    ///       arrays, ArrayLists etc.
    ///     
    /// 
    [
    Editor("System.Web.UI.Design.WebControls.DataGridComponentEditor, " + AssemblyRef.SystemDesign, typeof(ComponentEditor)),
    Designer("System.Web.UI.Design.WebControls.DataGridDesigner, " + AssemblyRef.SystemDesign) 
    ]
    [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] 
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] 
    public class DataGrid : BaseDataList, INamingContainer {
 
        private static readonly object EventCancelCommand = new object();
        private static readonly object EventDeleteCommand = new object();
        private static readonly object EventEditCommand = new object();
        private static readonly object EventItemCommand = new object(); 
        private static readonly object EventItemCreated = new object();
        private static readonly object EventItemDataBound = new object(); 
        private static readonly object EventPageIndexChanged = new object(); 
        private static readonly object EventSortCommand = new object();
        private static readonly object EventUpdateCommand = new object(); 



        ///  
        ///  Specifies the  command. This field is constant.
        ///  
        public const string SortCommandName = "Sort"; 

        ///  
        ///  Specifies the  command. This field is constant.
        /// 
        public const string SelectCommandName = "Select";
 
        /// 
        ///  Specifies the  command. This field is constant. 
        ///  
        public const string EditCommandName = "Edit";
 
        /// 
        ///  Specifies the  command. This field is constant.
        /// 
        public const string DeleteCommandName = "Delete"; 

        ///  
        ///  Specifies the  command. This field is constant. 
        /// 
        public const string UpdateCommandName = "Update"; 

        /// 
        ///  Specifies the  command. This field is constant.
        ///  
        public const string CancelCommandName = "Cancel";
 
        ///  
        ///  Specifies the  command. This field is constant.
        ///  
        public const string PageCommandName = "Page";

        /// 
        ///  Specifies the  argument. This field is constant. 
        /// 
        public const string NextPageCommandArgument = "Next"; 
 
        /// 
        ///  Specifies the  argument. This field is constant. 
        /// 
        public const string PrevPageCommandArgument = "Prev";

        internal const string DataSourceItemCountViewStateKey = "_!DataSourceItemCount"; 

        private IEnumerator storedData; 
        private object firstDataItem; 
        private bool storedDataValid;
        private PagedDataSource pagedDataSource; 

        private ArrayList columns;
        private DataGridColumnCollection columnCollection;
 
        private TableItemStyle headerStyle;
        private TableItemStyle footerStyle; 
        private TableItemStyle itemStyle; 
        private TableItemStyle alternatingItemStyle;
        private TableItemStyle selectedItemStyle; 
        private TableItemStyle editItemStyle;
        private DataGridPagerStyle pagerStyle;

        private ArrayList itemsArray; 
        private DataGridItemCollection itemsCollection;
 
        private ArrayList autoGenColumnsArray; 

 
        /// 
        ///    
        ///       Initializes a new instance of the  class.
        ///     
        /// 
        public DataGrid() { 
        } 

 

        /// 
        ///    Gets or sets a value that indicates whether custom paging is allowed.
        ///  
        [
        WebCategory("Paging"), 
        DefaultValue(false), 
        WebSysDescription(SR.DataGrid_AllowCustomPaging)
        ] 
        public virtual bool AllowCustomPaging {
            get {
                object o = ViewState["AllowCustomPaging"];
                if (o != null) 
                    return(bool)o;
                return false; 
            } 
            set {
                ViewState["AllowCustomPaging"] = value; 
            }
        }

 
        /// 
        ///    Gets or sets a value that indicates whether paging is allowed. 
        ///  
        [
        WebCategory("Paging"), 
        DefaultValue(false),
        WebSysDescription(SR.DataGrid_AllowPaging)
        ]
        public virtual bool AllowPaging { 
            get {
                object o = ViewState["AllowPaging"]; 
                if (o != null) 
                    return(bool)o;
                return false; 
            }
            set {
                ViewState["AllowPaging"] = value;
            } 
        }
 
 
        /// 
        ///    Gets or sets a value that indicates whether sorting is allowed. 
        /// 
        [
        WebCategory("Behavior"),
        DefaultValue(false), 
        WebSysDescription(SR.DataGrid_AllowSorting)
        ] 
        public virtual bool AllowSorting { 
            get {
                object o = ViewState["AllowSorting"]; 
                if (o != null)
                    return(bool)o;
                return false;
            } 
            set {
                ViewState["AllowSorting"] = value; 
            } 
        }
 

        /// 
        ///    Gets the style properties for alternating items in the
        ///    . This 
        ///       property is read-only. 
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_AlternatingItemStyle)
        ] 
        public virtual TableItemStyle AlternatingItemStyle {
            get { 
                if (alternatingItemStyle == null) { 
                    alternatingItemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)alternatingItemStyle).TrackViewState();
                }
                return alternatingItemStyle;
            } 
        }
 
 
        /// 
        ///    Gets or sets a value that indicates whether columns will automatically 
        ///       be created for each bound data field.
        /// 
        [
        WebCategory("Behavior"), 
        DefaultValue(true),
        WebSysDescription(SR.DataControls_AutoGenerateColumns) 
        ] 
        public virtual bool AutoGenerateColumns {
            get { 
                object o = ViewState["AutoGenerateColumns"];
                if (o != null)
                    return(bool)o;
                return true; 
            }
            set { 
                ViewState["AutoGenerateColumns"] = value; 
            }
        } 


        /// 
        ///    Gets or sets the URL of an image to display in the 
        ///       background of the .
        ///  
        [ 
        WebCategory("Appearance"),
        DefaultValue(""), 
        Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
        UrlProperty(),
        WebSysDescription(SR.WebControl_BackImageUrl)
        ] 
        public virtual string BackImageUrl {
            get { 
                if (ControlStyleCreated == false) { 
                    return String.Empty;
                } 
                return ((TableStyle)ControlStyle).BackImageUrl;
            }
            set {
                ((TableStyle)ControlStyle).BackImageUrl = value; 
            }
        } 
 

        ///  
        ///    Gets or sets the ordinal index of the currently displayed page. 
        /// 
        [
        Browsable(false), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_CurrentPageIndex) 
        ] 
        public int CurrentPageIndex {
            get { 
                object o = ViewState["CurrentPageIndex"];
                if (o != null)
                    return(int)o;
                return 0; 
            }
            set { 
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("value");
                } 
                ViewState["CurrentPageIndex"] = value;
            }
        }
 

 
        ///  
        /// Gets a collection of  controls in the . This property is read-only.
        ///  
        [
        DefaultValue(null),
        Editor("System.Web.UI.Design.WebControls.DataGridColumnCollectionEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
        MergableProperty(false), 
        PersistenceMode(PersistenceMode.InnerProperty),
        WebCategory("Default"), 
        WebSysDescription(SR.DataControls_Columns) 
        ]
        public virtual DataGridColumnCollection Columns { 
            get {
                if (columnCollection == null) {
                    columns = new ArrayList();
                    columnCollection = new DataGridColumnCollection(this, columns); 
                    if (IsTrackingViewState)
                        ((IStateManager)columnCollection).TrackViewState(); 
                } 
                return columnCollection;
            } 
        }

        /// 
        ///    Gets or sets the ordinal index of the item to be edited. 
        /// 
        [ 
        WebCategory("Default"), 
        DefaultValue(-1),
        WebSysDescription(SR.DataGrid_EditItemIndex) 
        ]
        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; 
            }
        } 
 

        ///  
        ///    Gets the style properties of the item to be edited. This property is read-only.
        /// 
        [
        WebCategory("Styles"), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        NotifyParentProperty(true), 
        PersistenceMode(PersistenceMode.InnerProperty), 
        WebSysDescription(SR.DataGrid_EditItemStyle)
        ] 
        public virtual TableItemStyle EditItemStyle {
            get {
                if (editItemStyle == null) {
                    editItemStyle = new TableItemStyle(); 
                    if (IsTrackingViewState)
                        ((IStateManager)editItemStyle).TrackViewState(); 
                } 
                return editItemStyle;
            } 
        }


        ///  
        ///    Gets the style properties of the footer item. This property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DefaultValue(null), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataControls_FooterStyle), 
        ]
        public virtual TableItemStyle FooterStyle { 
            get { 
                if (footerStyle == null) {
                    footerStyle = new TableItemStyle(); 
                    if (IsTrackingViewState)
                        ((IStateManager)footerStyle).TrackViewState();
                }
                return footerStyle; 
            }
        } 
 

        ///  
        ///    Gets the style properties of the header item. This property is read-only.
        /// 
        [
        WebCategory("Styles"), 
        DefaultValue(null),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true), 
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataControls_HeaderStyle) 
        ]
        public virtual TableItemStyle HeaderStyle {
            get {
                if (headerStyle == null) { 
                    headerStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)headerStyle).TrackViewState(); 
                }
                return headerStyle; 
            }
        }

 
        /// 
        /// Gets a collection of  objects representing the individual 
        ///    items within the control. 
        ///    This property is read-only.
        ///  
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_Items) 
        ]
        public virtual DataGridItemCollection Items { 
            get { 
                if (itemsCollection == null) {
                    if (itemsArray == null) { 
                        EnsureChildControls();
                    }
                    if (itemsArray == null) {
                        itemsArray = new ArrayList(); 
                    }
                    itemsCollection = new DataGridItemCollection(itemsArray); 
                } 
                return itemsCollection;
            } 
        }


        ///  
        ///    Gets the style properties of the individual items. This property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_ItemStyle),
        ] 
        public virtual TableItemStyle ItemStyle {
            get { 
                if (itemStyle == null) { 
                    itemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)itemStyle).TrackViewState();
                }
                return itemStyle;
            } 
        }
 
 
        /// 
        ///    Gets the total number of pages to be displayed. This property is read-only. 
        /// 
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        WebSysDescription(SR.DataGrid_PageCount)
        ] 
        public int PageCount { 
            get {
                if (pagedDataSource != null) { 
                    return pagedDataSource.PageCount;
                }
                else {
                    object o = ViewState["PageCount"]; 
                    return (o != null) ? (int)o : 0;
                } 
            } 
        }
 

        /// 
        ///    Gets the style properties of the pager buttons for the
        ///    . This 
        ///       property is read-only.
        ///  
        [ 
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty),
        WebSysDescription(SR.DataGrid_PagerStyle)
        ] 
        public virtual DataGridPagerStyle PagerStyle {
            get { 
                if (pagerStyle == null) { 
                    pagerStyle = new DataGridPagerStyle(this);
                    if (IsTrackingViewState) 
                        ((IStateManager)pagerStyle).TrackViewState();
                }
                return pagerStyle;
            } 
        }
 
 
        /// 
        ///    Gets or sets the number of items to display on a single page. 
        /// 
        [
        WebCategory("Paging"),
        DefaultValue(10), 
        WebSysDescription(SR.DataGrid_PageSize),
        ] 
        public virtual int PageSize { 
            get {
                object o = ViewState["PageSize"]; 
                if (o != null)
                    return(int)o;
                return 10;
            } 
            set {
                if (value < 1) { 
                    throw new ArgumentOutOfRangeException("value"); 
                }
                ViewState["PageSize"] = value; 
            }
        }

 
        /// 
        ///    Gets or sets the index of the currently selected item. 
        ///  
        [
        Bindable(true), 
        DefaultValue(-1),
        WebSysDescription(SR.WebControl_SelectedIndex)
        ]
        public virtual int SelectedIndex { 
            get {
                object o = ViewState["SelectedIndex"]; 
                if (o != null) 
                    return(int)o;
                return -1; 
            }
            set {
                if (value < -1) {
                    throw new ArgumentOutOfRangeException("value"); 
                }
                int oldSelectedIndex = SelectedIndex; 
                ViewState["SelectedIndex"] = value; 

                if (itemsArray != null) { 
                    DataGridItem item;

                    if ((oldSelectedIndex != -1) && (itemsArray.Count > oldSelectedIndex)) {
                        item = (DataGridItem)itemsArray[oldSelectedIndex]; 

                        if (item.ItemType != ListItemType.EditItem) { 
                            ListItemType itemType = ListItemType.Item; 
                            if (oldSelectedIndex % 2 != 0)
                                itemType = ListItemType.AlternatingItem; 
                            item.SetItemType(itemType);
                        }
                    }
                    if ((value != -1) && (itemsArray.Count > value)) { 
                        item = (DataGridItem)itemsArray[value];
                        if (item.ItemType != ListItemType.EditItem) 
                            item.SetItemType(ListItemType.SelectedItem); 
                    }
                } 
            }
        }

 
        /// 
        /// Gets the selected item in the . This property is read-only. 
        ///  
        [
        Browsable(false), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
        WebSysDescription(SR.DataGrid_SelectedItem)
        ]
        public virtual DataGridItem SelectedItem { 
            get {
                int index = SelectedIndex; 
                DataGridItem item = null; 

                if (index != -1) { 
                    item = Items[index];
                }
                return item;
            } 
        }
 
 
        /// 
        ///    Gets the style properties of the currently selected item. This property is read-only. 
        /// 
        [
        WebCategory("Styles"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
        NotifyParentProperty(true),
        PersistenceMode(PersistenceMode.InnerProperty), 
        WebSysDescription(SR.DataGrid_SelectedItemStyle) 
        ]
        public virtual TableItemStyle SelectedItemStyle { 
            get {
                if (selectedItemStyle == null) {
                    selectedItemStyle = new TableItemStyle();
                    if (IsTrackingViewState) 
                        ((IStateManager)selectedItemStyle).TrackViewState();
                } 
                return selectedItemStyle; 
            }
        } 


        /// 
        ///    Gets or sets a value that specifies whether the footer is displayed in the 
        ///    .
        ///  
        [ 
        WebCategory("Appearance"),
        DefaultValue(false), 
        WebSysDescription(SR.DataControls_ShowFooter)
        ]
        public virtual bool ShowFooter {
            get { 
                object o = ViewState["ShowFooter"];
                if (o != null) 
                    return(bool)o; 
                return false;
            } 
            set {
                ViewState["ShowFooter"] = value;
            }
        } 

 
        ///  
        ///    Gets or sets a value that specifies whether the header is displayed in the
        ///    . 
        /// 
        [
        WebCategory("Appearance"),
        DefaultValue(true), 
        WebSysDescription(SR.DataControls_ShowHeader)
        ] 
        public virtual bool ShowHeader { 
            get {
                object o = ViewState["ShowHeader"]; 
                if (o != null)
                    return(bool)o;
                return true;
            } 
            set {
                ViewState["ShowHeader"] = value; 
            } 
        }
        protected override HtmlTextWriterTag TagKey { 
            get {
                return HtmlTextWriterTag.Table;
            }
        } 

 
        ///  
        ///    Gets or sets the number of rows to display in the
        /// . 
        /// 
        [
        Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
        WebSysDescription(SR.DataGrid_VisibleItemCount)
        ] 
        public virtual int VirtualItemCount { 
            get {
                object o = ViewState["VirtualItemCount"]; 
                if (o != null)
                    return(int)o;
                return 0;
            } 
            set {
                if (value < 0) { 
                    throw new ArgumentOutOfRangeException("value"); 
                }
                ViewState["VirtualItemCount"] = value; 
            }
        }

 

 
        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of 
        /// .
        /// 
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnCancelCommand)
        ] 
        public event DataGridCommandEventHandler CancelCommand { 
            add {
                Events.AddHandler(EventCancelCommand, value); 
            }
            remove {
                Events.RemoveHandler(EventCancelCommand, value);
            } 
        }
 
 

        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of .
        /// 
        [ 
        WebCategory("Action"),
        WebSysDescription(SR.DataGrid_OnDeleteCommand) 
        ] 
        public event DataGridCommandEventHandler DeleteCommand {
            add { 
                Events.AddHandler(EventDeleteCommand, value);
            }
            remove {
                Events.RemoveHandler(EventDeleteCommand, value); 
            }
        } 
 

 
        /// 
        /// Occurs when a control bubbles an event to the  with a
        ///  property of
        /// . 
        /// 
        [ 
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnEditCommand)
        ] 
        public event DataGridCommandEventHandler EditCommand {
            add {
                Events.AddHandler(EventEditCommand, value);
            } 
            remove {
                Events.RemoveHandler(EventEditCommand, value); 
            } 
        }
 


        /// 
        /// Occurs when a control bubbles an event to the  not covered by 
        /// , ,  or
        /// . 
        ///  
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnItemCommand)
        ]
        public event DataGridCommandEventHandler ItemCommand {
            add { 
                Events.AddHandler(EventItemCommand, value);
            } 
            remove { 
                Events.RemoveHandler(EventItemCommand, value);
            } 
        }


 
        /// 
        ///    Occurs on the server when a control a created. 
        ///  
        [
        WebCategory("Behavior"), 
        WebSysDescription(SR.DataControls_OnItemCreated)
        ]
        public event DataGridItemEventHandler ItemCreated {
            add { 
                Events.AddHandler(EventItemCreated, value);
            } 
            remove { 
                Events.RemoveHandler(EventItemCreated, value);
            } 
        }


        ///  
        ///    Occurs when an item is data bound to the control.
        ///  
        [ 
        WebCategory("Behavior"),
        WebSysDescription(SR.DataControls_OnItemDataBound) 
        ]
        public event DataGridItemEventHandler ItemDataBound {
            add {
                Events.AddHandler(EventItemDataBound, value); 
            }
            remove { 
                Events.RemoveHandler(EventItemDataBound, value); 
            }
        } 


        /// 
        ///    Occurs the one of the pager buttons is clicked. 
        /// 
        [ 
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnPageIndexChanged)
        ] 
        public event DataGridPageChangedEventHandler PageIndexChanged {
            add {
                Events.AddHandler(EventPageIndexChanged, value);
            } 
            remove {
                Events.RemoveHandler(EventPageIndexChanged, value); 
            } 
        }
 



        ///  
        ///    Occurs when a column is sorted.
        ///  
        [ 
        WebCategory("Action"),
        WebSysDescription(SR.DataGrid_OnSortCommand) 
        ]
        public event DataGridSortCommandEventHandler SortCommand {
            add {
                Events.AddHandler(EventSortCommand, value); 
            }
            remove { 
                Events.RemoveHandler(EventSortCommand, value); 
            }
        } 



        ///  
        /// Occurs when a control bubbles an event to the  with a
        ///  property of . 
        ///  
        [
        WebCategory("Action"), 
        WebSysDescription(SR.DataGrid_OnUpdateCommand)
        ]
        public event DataGridCommandEventHandler UpdateCommand {
            add { 
                Events.AddHandler(EventUpdateCommand, value);
            } 
            remove { 
                Events.RemoveHandler(EventUpdateCommand, value);
            } 
        }


        ///  
        /// 
        ///  Caches the fact that we have already consumed the first item from the enumeration 
        ///  and must use it first during our item creation. 
        /// 
        internal void StoreEnumerator(IEnumerator dataSource, object firstDataItem) { 
            this.storedData = dataSource;
            this.firstDataItem = firstDataItem;

            this.storedDataValid = true; 
        }
 
 
        /// 
        ///  
        private ArrayList CreateAutoGeneratedColumns(PagedDataSource dataSource) {
            if (dataSource == null) {
                // note that we're not throwing an exception in this case, and the calling
                // code should be able to handle a null arraylist being returned 
                return null;
            } 
 
            ArrayList generatedColumns = new ArrayList();
            PropertyDescriptorCollection propDescs = null; 
            bool throwException = true;

            // try ITypedList first
            // A PagedDataSource implements this, but returns null, if the underlying data source 
            // does not implement it.
            propDescs = ((ITypedList)dataSource).GetItemProperties(new PropertyDescriptor[0]); 
 
            if (propDescs == null) {
                Type sampleItemType = null; 
                object sampleItem = null;

                IEnumerable realDataSource = dataSource.DataSource;
                Debug.Assert(realDataSource != null, "Must have a real data source when calling CreateAutoGeneratedColumns"); 

                Type dataSourceType = realDataSource.GetType(); 
 
                // try for a typed Item property, which should be present on strongly typed collections
                PropertyInfo itemProp = dataSourceType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance, null, null, new Type[] { typeof(int) }, null); 
                if (itemProp != null) {
                    sampleItemType = itemProp.PropertyType;
                }
 
                if ((sampleItemType == null) || (sampleItemType == typeof(object))) {
                    // last resort... try to get ahold of the first item by beginning the 
                    // enumeration 

                    IEnumerator e = dataSource.GetEnumerator(); 

                    if (e.MoveNext()) {
                        sampleItem = e.Current;
                    } 
                    else {
                        // we don't want to throw an exception if we're bound to an IEnumerable 
                        // data source with no records... we'll simply bail and not show any data 
                        throwException = false;
                    } 
                    if (sampleItem != null) {
                        sampleItemType = sampleItem.GetType();
                    }
 
                    // We must store the enumerator regardless of whether we got back an item from it
                    // because we cannot start the enumeration again, in the case of a DataReader. 
                    // Code in CreateControlHierarchy must deal appropriately for the case where 
                    // there is a stored enumerator, but a null object as the first item.
                    StoreEnumerator(e, sampleItem); 
                }

                if ((sampleItem != null) && (sampleItem is ICustomTypeDescriptor)) {
                    // Get the custom properties of the object 
                    propDescs = TypeDescriptor.GetProperties(sampleItem);
                } 
                else if (sampleItemType != null) { 
                    // directly bindable types: strings, ints etc. get treated special, since we
                    // don't care about their properties, but rather we care about them directly 
                    if (BaseDataList.IsBindableType(sampleItemType)) {
                        BoundColumn column = new BoundColumn();

                        ((IStateManager)column).TrackViewState(); 
                        column.HeaderText = "Item";
                        column.DataField = BoundColumn.thisExpr; 
                        column.SortExpression = "Item"; 

                        column.SetOwner(this); 
                        generatedColumns.Add(column);
                    }
                    else {
                        // complex type... we get its properties 
                        propDescs = TypeDescriptor.GetProperties(sampleItemType);
                    } 
                } 
            }
 
            if ((propDescs != null) && (propDescs.Count != 0)) {
                foreach (PropertyDescriptor pd in propDescs) {
                    Type propType = pd.PropertyType;
 
                    if (BaseDataList.IsBindableType(propType)) {
                        BoundColumn column = new BoundColumn(); 
 
                        ((IStateManager)column).TrackViewState();
                        column.HeaderText = pd.Name; 
                        column.DataField = pd.Name;
                        column.SortExpression = pd.Name;
                        column.ReadOnly = pd.IsReadOnly;
 
                        column.SetOwner(this);
                        generatedColumns.Add(column); 
                    } 
                }
            } 

            if ((generatedColumns.Count == 0) && throwException) {
                // this handles the case where we got back something that either had no
                // properties, or all properties were not bindable. 
                throw new HttpException(SR.GetString(SR.DataGrid_NoAutoGenColumns, ID));
            } 
 
            return generatedColumns;
        } 


        /// 
        ///   Creates the set of columns to be used to build up the control 
        ///   hierarchy.
        ///   When AutoGenerateColumns is true, the columns are created to match the 
        ///   datasource and are appended to the set of columns defined in the Columns 
        ///   collection.
        ///  
        protected virtual ArrayList CreateColumnSet(PagedDataSource dataSource, bool useDataSource) {
            ArrayList columnsArray = new ArrayList();

            DataGridColumn[] definedColumns = new DataGridColumn[Columns.Count]; 
            Columns.CopyTo(definedColumns, 0);
 
            int i; 

            for (i = 0; i < definedColumns.Length; i++) 
                columnsArray.Add(definedColumns[i]);

            if (AutoGenerateColumns == true) {
                ArrayList autoColumns = null; 
                if (useDataSource) {
                    autoColumns = CreateAutoGeneratedColumns(dataSource); 
                    autoGenColumnsArray = autoColumns; 
                }
                else { 
                    autoColumns = autoGenColumnsArray;
                }

                if (autoColumns != null) { 
                    int autoColumnCount = autoColumns.Count;
 
                    for (i = 0; i < autoColumnCount; i++) 
                        columnsArray.Add(autoColumns[i]);
                } 
            }

            return columnsArray;
        } 

 
        ///  
        /// 
        ///    Creates the control hierarchy that is used to render the DataGrid. 
        ///       This is called whenever a control hierarchy is needed and the
        ///       ChildControlsCreated property is false.
        ///       The implementation assumes that all the children in the controls
        ///       collection have already been cleared. 
        /// 
        protected override void CreateControlHierarchy(bool useDataSource) { 
            pagedDataSource = CreatePagedDataSource(); 

            IEnumerator dataSource = null; 
            int count = -1;
            int totalCount = -1;
            ArrayList keysArray = DataKeysArray;
            ArrayList columnsArray = null; 

            if (itemsArray != null) { 
                itemsArray.Clear(); 
            }
            else { 
                itemsArray = new ArrayList();
            }
            itemsCollection = null;
 
            if (useDataSource == false) {
                // ViewState must have a non-null value for ItemCount because we check for 
                // this in CreateChildControls 
                count = (int)ViewState[BaseDataList.ItemCountViewStateKey];
                totalCount = (int)ViewState[DataSourceItemCountViewStateKey]; 

                if (count != -1) {
                    if (pagedDataSource.IsCustomPagingEnabled) {
                        pagedDataSource.DataSource = new DummyDataSource(count); 
                    }
                    else { 
                        pagedDataSource.DataSource = new DummyDataSource(totalCount); 
                    }
                    dataSource = pagedDataSource.GetEnumerator(); 
                    columnsArray = CreateColumnSet(null, false);

                    itemsArray.Capacity = count;
                } 
            }
            else { 
                keysArray.Clear(); 

                IEnumerable realDataSource = GetData(); 

                if (realDataSource != null) {
                    ICollection collection = realDataSource as ICollection;
 
                    if ((collection == null) &&
                        pagedDataSource.IsPagingEnabled && !pagedDataSource.IsCustomPagingEnabled) { 
                        throw new HttpException(SR.GetString(SR.DataGrid_Missing_VirtualItemCount, ID)); 
                    }
 
                    pagedDataSource.DataSource = realDataSource;
                    if (pagedDataSource.IsPagingEnabled) {
                        if ((pagedDataSource.CurrentPageIndex < 0) || (pagedDataSource.CurrentPageIndex >= pagedDataSource.PageCount)) {
                            throw new HttpException(SR.GetString(SR.Invalid_CurrentPageIndex)); 
                        }
                    } 
                    columnsArray = CreateColumnSet(pagedDataSource, useDataSource); 

                    if (storedDataValid) { 
                        dataSource = storedData;
                    }
                    else {
                        dataSource = pagedDataSource.GetEnumerator(); 
                    }
 
                    if (collection != null) { 
                        int initialCapacity = pagedDataSource.Count;
                        keysArray.Capacity = initialCapacity; 
                        itemsArray.Capacity = initialCapacity;
                    }
                }
            } 

            int columnCount = 0; 
            if (columnsArray != null) 
                columnCount = columnsArray.Count;
 
            if (columnCount > 0) {
                DataGridColumn[] displayColumns = new DataGridColumn[columnCount];
                columnsArray.CopyTo(displayColumns, 0);
 
                Table table = new ChildTable(String.IsNullOrEmpty(ID) ? null : ClientID);
                Controls.Add(table); 
 
                for (int c = 0; c < displayColumns.Length; c++) {
                    displayColumns[c].Initialize(); 
                }

                TableRowCollection rows = table.Rows;
                DataGridItem item; 
                ListItemType itemType;
                int index = 0; 
                int dataSetIndex = 0; 

                string keyField = DataKeyField; 
                bool storeKeys = (useDataSource && (keyField.Length != 0));
                bool createPager = pagedDataSource.IsPagingEnabled;
                int editItemIndex = EditItemIndex;
                int selectedItemIndex = SelectedIndex; 

                if (pagedDataSource.IsPagingEnabled) 
                    dataSetIndex = pagedDataSource.FirstIndexInPage; 

                count = 0; 

                if (createPager) {
                    // top pager
                    CreateItem(-1, -1, ListItemType.Pager, false, null, displayColumns, rows, pagedDataSource); 
                }
 
                CreateItem(-1, -1, ListItemType.Header, useDataSource, null, displayColumns, rows, null); 

                if (storedDataValid && (firstDataItem != null)) { 
                    if (storeKeys) {
                        object keyValue = DataBinder.GetPropertyValue(firstDataItem, keyField);
                        keysArray.Add(keyValue);
                    } 

                    itemType = ListItemType.Item; 
                    if (index == editItemIndex) 
                        itemType = ListItemType.EditItem;
                    else if (index == selectedItemIndex) 
                        itemType = ListItemType.SelectedItem;

                    item = CreateItem(0, dataSetIndex, itemType, useDataSource, firstDataItem, displayColumns, rows, null);
                    itemsArray.Add(item); 

                    count++; 
                    index++; 
                    dataSetIndex++;
 
                    storedDataValid = false;
                    firstDataItem = null;
                }
 
                while (dataSource.MoveNext()) {
                    object dataItem = dataSource.Current; 
 
                    if (storeKeys) {
                        object keyValue = DataBinder.GetPropertyValue(dataItem, keyField); 
                        keysArray.Add(keyValue);
                    }

                    itemType = ListItemType.Item; 

                    if (index == editItemIndex) 
                        itemType = ListItemType.EditItem; 
                    else if (index == selectedItemIndex)
                        itemType = ListItemType.SelectedItem; 
                    else if (index % 2 != 0) {
                        itemType = ListItemType.AlternatingItem;
                    }
 
                    item = CreateItem(index, dataSetIndex, itemType, useDataSource, dataItem, displayColumns, rows, null);
                    itemsArray.Add(item); 
 
                    count++;
                    dataSetIndex++; 
                    index++;
                }

                CreateItem(-1, -1, ListItemType.Footer, useDataSource, null, displayColumns, rows, null); 

                if (createPager) { 
                    // bottom pager 
                    CreateItem(-1, -1, ListItemType.Pager, false, null, displayColumns, rows, pagedDataSource);
                } 
            }

            if (useDataSource) {
                // save the number of items and pages contained in the DataGrid for use in round-trips 
                if (dataSource != null) {
                    ViewState[BaseDataList.ItemCountViewStateKey] = count; 
                    if (pagedDataSource.IsPagingEnabled) { 
                        ViewState["PageCount"] = pagedDataSource.PageCount;
                        ViewState[DataSourceItemCountViewStateKey] = pagedDataSource.DataSourceCount; 
                    }
                    else {
                        ViewState["PageCount"] = 1;
                        ViewState[DataSourceItemCountViewStateKey] = count; 
                    }
                } 
                else { 
                    ViewState[BaseDataList.ItemCountViewStateKey] = -1;
                    ViewState[DataSourceItemCountViewStateKey] = -1; 
                    ViewState["PageCount"] = 0;
                }
            }
 
            pagedDataSource = null;
        } 
 

        ///  
        /// 
        ///    Creates new control style.
        /// 
        protected override Style CreateControlStyle() { 
            TableStyle controlStyle = new TableStyle();
 
            // initialize defaults that are different from TableStyle 
            controlStyle.GridLines = GridLines.Both;
            controlStyle.CellSpacing = 0; 

            return controlStyle;
        }
 
        private DataGridItem CreateItem(int itemIndex, int dataSourceIndex, ListItemType itemType, bool dataBind, object dataItem, DataGridColumn[] columns, TableRowCollection rows, PagedDataSource pagedDataSource) {
            DataGridItem item = CreateItem(itemIndex, dataSourceIndex, itemType); 
            DataGridItemEventArgs e = new DataGridItemEventArgs(item); 

            if (itemType != ListItemType.Pager) { 
                InitializeItem(item, columns);
                if (dataBind) {
                    item.DataItem = dataItem;
                } 
                OnItemCreated(e);
                rows.Add(item); 
 
                if (dataBind) {
                    item.DataBind(); 
                    OnItemDataBound(e);

                    item.DataItem = null;
                } 
            }
            else { 
                InitializePager(item, columns.Length, pagedDataSource); 
                OnItemCreated(e);
                rows.Add(item); 
            }

            return item;
        } 

 
        ///  
        ///    [To be supplied.]
        ///  
        protected virtual DataGridItem CreateItem(int itemIndex, int dataSourceIndex, ListItemType itemType) {
            return new DataGridItem(itemIndex, dataSourceIndex, itemType);
        }
 
        private PagedDataSource CreatePagedDataSource() {
            PagedDataSource pagedDataSource = new PagedDataSource(); 
 
            pagedDataSource.CurrentPageIndex = CurrentPageIndex;
            pagedDataSource.PageSize = PageSize; 
            pagedDataSource.AllowPaging = AllowPaging;
            pagedDataSource.AllowCustomPaging = AllowCustomPaging;
            pagedDataSource.VirtualCount = VirtualItemCount;
 
            return pagedDataSource;
        } 
 

        ///  
        ///    [To be supplied.]
        /// 
        protected virtual void InitializeItem(DataGridItem item, DataGridColumn[] columns) {
            TableCellCollection cells = item.Cells; 

            for (int i = 0; i < columns.Length; i++) { 
                TableCell cell; 
                if ((item.ItemType == ListItemType.Header) && UseAccessibleHeader) {
                    cell = new TableHeaderCell(); 
                    cell.Attributes["scope"] = "col";
                }
                else {
                    cell = new TableCell(); 
                }
 
                columns[i].InitializeCell(cell, i, item.ItemType); 
                cells.Add(cell);
            } 
        }


        ///  
        ///    
        ///   Creates a DataGridItem that contains the paging UI. 
        ///   The paging UI is a navigation bar that is a built into a single TableCell that 
        ///   spans across all columns of the DataGrid.
        ///     
        /// 
        protected virtual void InitializePager(DataGridItem item, int columnSpan, PagedDataSource pagedDataSource) {
            TableCell cell = new TableCell();
            if (columnSpan > 1) { 
                cell.ColumnSpan = columnSpan;
            } 
 
            DataGridPagerStyle pagerStyle = PagerStyle;
 
            if (pagerStyle.Mode == PagerMode.NextPrev) {
                if (pagedDataSource.IsFirstPage == false) {
                    LinkButton prevButton = new DataGridLinkButton();
                    prevButton.Text = pagerStyle.PrevPageText; 
                    prevButton.CommandName = DataGrid.PageCommandName;
                    prevButton.CommandArgument = DataGrid.PrevPageCommandArgument; 
                    prevButton.CausesValidation = false; 
                    cell.Controls.Add(prevButton);
                } 
                else {
                    Label prevLabel = new Label();
                    prevLabel.Text = pagerStyle.PrevPageText;
                    cell.Controls.Add(prevLabel); 
                }
 
                cell.Controls.Add(new LiteralControl(" ")); 

                if (pagedDataSource.IsLastPage == false) { 
                    LinkButton nextButton = new DataGridLinkButton();
                    nextButton.Text = pagerStyle.NextPageText;
                    nextButton.CommandName = DataGrid.PageCommandName;
                    nextButton.CommandArgument = DataGrid.NextPageCommandArgument; 
                    nextButton.CausesValidation = false;
                    cell.Controls.Add(nextButton); 
                } 
                else {
                    Label nextLabel = new Label(); 
                    nextLabel.Text = pagerStyle.NextPageText;
                    cell.Controls.Add(nextLabel);
                }
            } 
            else {
                int pages = pagedDataSource.PageCount; 
                int currentPage = pagedDataSource.CurrentPageIndex + 1; 
                int pageSetSize = pagerStyle.PageButtonCount;
                int pagesShown = pageSetSize; 

                // ensure the number of pages we show isn't more than the number of pages that do exist
                if (pages < pagesShown)
                    pagesShown = pages; 

                // initialze to the first page set, i.e., pages 1 through number of pages shown 
                int firstPage = 1; 
                int lastPage = pagesShown;
 
                if (currentPage > lastPage) {
                    // The current page is not in the first page set, then we need to slide the
                    // range of pages shown by adjusting firstPage and lastPage
                    int currentPageSet = pagedDataSource.CurrentPageIndex / pageSetSize; 
                    firstPage = currentPageSet * pageSetSize + 1;
                    lastPage = firstPage + pageSetSize - 1; 
 
                    // now bring back lastPage into the range if its exceeded the number of pages
                    if (lastPage > pages) 
                        lastPage = pages;

                    // if theres room to show more pages from the previous page set, then adjust
                    // the first page accordingly 
                    if (lastPage - firstPage + 1 < pageSetSize) {
                        firstPage = Math.Max(1, lastPage - pageSetSize + 1); 
                    } 
                }
 
                LinkButton button;

                if (firstPage != 1) {
                    button = new DataGridLinkButton(); 

                    button.Text = "..."; 
                    button.CommandName = DataGrid.PageCommandName; 
                    button.CommandArgument = (firstPage - 1).ToString(NumberFormatInfo.InvariantInfo);
                    button.CausesValidation = false; 
                    cell.Controls.Add(button);

                    cell.Controls.Add(new LiteralControl(" "));
                } 

                for (int i = firstPage; i <= lastPage; i++) { 
                    string pageString = (i).ToString(NumberFormatInfo.InvariantInfo); 
                    if (i == currentPage) {
                        Label label = new Label(); 

                        label.Text = pageString;
                        cell.Controls.Add(label);
                    } 
                    else {
                        button = new DataGridLinkButton(); 
 
                        button.Text = pageString;
                        button.CommandName = DataGrid.PageCommandName; 
                        button.CommandArgument = pageString;
                        button.CausesValidation = false;
                        cell.Controls.Add(button);
                    } 

                    if (i < lastPage) { 
                        cell.Controls.Add(new LiteralControl(" ")); 
                    }
                } 

                if (pages > lastPage) {
                    cell.Controls.Add(new LiteralControl(" "));
 
                    button = new DataGridLinkButton();
 
                    button.Text = "..."; 
                    button.CommandName = DataGrid.PageCommandName;
                    button.CommandArgument = (lastPage + 1).ToString(NumberFormatInfo.InvariantInfo); 
                    button.CausesValidation = false;
                    cell.Controls.Add(button);
                }
            } 

            item.Cells.Add(cell); 
        } 

 
        /// 
        /// 
        /// Loads a saved state of the .
        ///  
        protected override void LoadViewState(object savedState) {
            if (savedState != null) { 
                object[] myState = (object[])savedState; 

                if (myState[0] != null) 
                    base.LoadViewState(myState[0]);
                if (myState[1] != null)
                    ((IStateManager)Columns).LoadViewState(myState[1]);
                if (myState[2] != null) 
                    ((IStateManager)PagerStyle).LoadViewState(myState[2]);
                if (myState[3] != null) 
                    ((IStateManager)HeaderStyle).LoadViewState(myState[3]); 
                if (myState[4] != null)
                    ((IStateManager)FooterStyle).LoadViewState(myState[4]); 
                if (myState[5] != null)
                    ((IStateManager)ItemStyle).LoadViewState(myState[5]);
                if (myState[6] != null)
                    ((IStateManager)AlternatingItemStyle).LoadViewState(myState[6]); 
                if (myState[7] != null)
                    ((IStateManager)SelectedItemStyle).LoadViewState(myState[7]); 
                if (myState[8] != null) 
                    ((IStateManager)EditItemStyle).LoadViewState(myState[8]);
                if (myState[9] != null) 
                    ((IStateManager)ControlStyle).LoadViewState(myState[9]);
                if (myState[10] != null) {
                    object[] autoGenColumnState = (object[])myState[10];
                    int columnCount = autoGenColumnState.Length; 

                    if (columnCount != 0) 
                        autoGenColumnsArray = new ArrayList(); 
                    else
                        autoGenColumnsArray = null; 

                    for (int i = 0; i < columnCount; i++) {
                        BoundColumn column = new BoundColumn();
 
                        ((IStateManager)column).TrackViewState();
                        ((IStateManager)column).LoadViewState(autoGenColumnState[i]); 
 
                        column.SetOwner(this);
                        autoGenColumnsArray.Add(column); 
                    }
                }
            }
        } 

 
        ///  
        /// 
        ///  
        protected override bool OnBubbleEvent(object source, EventArgs e) {
            bool handled = false;

            if (e is DataGridCommandEventArgs) { 
                DataGridCommandEventArgs dce = (DataGridCommandEventArgs)e;
 
                OnItemCommand(dce); 
                handled = true;
 
                string command = dce.CommandName;

                if (StringUtil.EqualsIgnoreCase(command, DataGrid.SelectCommandName)) {
                    SelectedIndex = dce.Item.ItemIndex; 
                    OnSelectedIndexChanged(EventArgs.Empty);
                } 
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.PageCommandName)) { 
                    string pageNumberArg = (string)dce.CommandArgument;
 
                    int newPage = CurrentPageIndex;

                    if (StringUtil.EqualsIgnoreCase(pageNumberArg, DataGrid.NextPageCommandArgument)) {
                        newPage++; 
                    }
                    else if (StringUtil.EqualsIgnoreCase(pageNumberArg, DataGrid.PrevPageCommandArgument)) { 
                        newPage--; 
                    }
                    else { 
                        // argument is page number, and page index is 1 less than that
                        newPage = Int32.Parse(pageNumberArg, CultureInfo.InvariantCulture) - 1;
                    }
 
                    DataGridPageChangedEventArgs args = new DataGridPageChangedEventArgs(source, newPage);
                    OnPageIndexChanged(args); 
                } 
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.SortCommandName)) {
                    DataGridSortCommandEventArgs args = new DataGridSortCommandEventArgs(source, dce); 
                    OnSortCommand(args);
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.EditCommandName)) {
                    OnEditCommand(dce); 
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.UpdateCommandName)) { 
                    OnUpdateCommand(dce); 
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.CancelCommandName)) { 
                    OnCancelCommand(dce);
                }
                else if (StringUtil.EqualsIgnoreCase(command, DataGrid.DeleteCommandName)) {
                    OnDeleteCommand(dce); 
                }
            } 
 
            return handled;
        } 


        /// 
        ///  
        internal void OnColumnsChanged() {
            if (Initialized) { 
                RequiresDataBinding = true; 
            }
        } 


        /// 
        /// Raises the event. 
        /// 
        protected virtual void OnCancelCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventCancelCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnDeleteCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventDeleteCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnEditCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventEditCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemCommand(DataGridCommandEventArgs e) { 
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventItemCommand]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemCreated(DataGridItemEventArgs e) { 
            DataGridItemEventHandler handler = (DataGridItemEventHandler)Events[EventItemCreated]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnItemDataBound(DataGridItemEventArgs e) { 
            DataGridItemEventHandler handler = (DataGridItemEventHandler)Events[EventItemDataBound]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        /// Raises the  event. 
        /// 
        protected virtual void OnPageIndexChanged(DataGridPageChangedEventArgs e) { 
            DataGridPageChangedEventHandler handler = (DataGridPageChangedEventHandler)Events[EventPageIndexChanged]; 
            if (handler != null) handler(this, e);
        } 


        /// 
        ///  
        internal void OnPagerChanged() {
        } 
 

        ///  
        /// Raises the  event.
        /// 
        protected virtual void OnSortCommand(DataGridSortCommandEventArgs e) {
            DataGridSortCommandEventHandler handler = (DataGridSortCommandEventHandler)Events[EventSortCommand]; 
            if (handler != null) handler(this, e);
        } 
 

        ///  
        /// Raises the  event.
        /// 
        protected virtual void OnUpdateCommand(DataGridCommandEventArgs e) {
            DataGridCommandEventHandler handler = (DataGridCommandEventHandler)Events[EventUpdateCommand]; 
            if (handler != null) handler(this, e);
        } 
 

        ///  
        /// 
        /// 
        protected internal override void PrepareControlHierarchy() {
            if (Controls.Count == 0) 
                return;
 
            Table childTable = (Table)Controls[0]; 
            childTable.CopyBaseAttributes(this);
            childTable.Caption = Caption; 
            childTable.CaptionAlign = CaptionAlign;
            if (ControlStyleCreated) {
                childTable.ApplyStyle(ControlStyle);
            } 
            else {
                // Since we didn't create a ControlStyle yet, the default 
                // settings for the default style of the control need to be applied 
                // to the child table control directly
                // 

                childTable.GridLines = GridLines.Both;
                childTable.CellSpacing = 0;
            } 

            TableRowCollection rows = childTable.Rows; 
            int rowCount = rows.Count; 

            if (rowCount == 0) 
                return;

            int columnCount = Columns.Count;
            DataGridColumn[] definedColumns = new DataGridColumn[columnCount]; 
            if (columnCount > 0)
                Columns.CopyTo(definedColumns, 0); 
 
            // the composite alternating item style, so we need to do just one
            // merge style on the actual item 
            Style altItemStyle = null;
            if (alternatingItemStyle != null) {
                altItemStyle = new TableItemStyle();
                altItemStyle.CopyFrom(itemStyle); 
                altItemStyle.CopyFrom(alternatingItemStyle);
            } 
            else { 
                altItemStyle = itemStyle;
            } 

            int visibleColumns = 0;
            bool calculateColumns = true;
            for (int i = 0; i < rowCount; i++) { 
                DataGridItem item = (DataGridItem)rows[i];
 
                switch (item.ItemType) { 
                    case ListItemType.Header:
                        if (ShowHeader == false) { 
                            item.Visible = false;
                            continue;   // with the next row
                        }
                        else { 
                            if (headerStyle != null) {
                                item.MergeStyle(headerStyle); 
                            } 
                        }
                        break; 

                    case ListItemType.Footer:
                        if (ShowFooter == false) {
                            item.Visible = false; 
                            continue;   // with the next row
                        } 
                        else { 
                            item.MergeStyle(footerStyle);
                        } 
                        break;

                    case ListItemType.Pager:
                        if (pagerStyle.Visible == false) { 
                            item.Visible = false;
                            continue;   // with the next row 
                        } 
                        else {
                            if (i == 0) { 
                                // top pager
                                if (pagerStyle.IsPagerOnTop == false) {
                                    item.Visible = false;
                                    continue; 
                                }
                            } 
                            else { 
                                // bottom pager
                                if (pagerStyle.IsPagerOnBottom == false) { 
                                    item.Visible = false;
                                    continue;
                                }
                            } 

                            item.MergeStyle(pagerStyle); 
                        } 
                        break;
 
                    case ListItemType.Item:
                        item.MergeStyle(itemStyle);
                        break;
 
                    case ListItemType.AlternatingItem:
                        item.MergeStyle(altItemStyle); 
                        break; 

                    case ListItemType.SelectedItem: 
                        // When creating the control hierarchy we first check if the
                        // item is in edit mode, so we know this item cannot be in edit
                        // mode. The only special characteristic of this item is that
                        // it is selected. 
                        {
                            Style s = new TableItemStyle(); 
 
                            if (item.ItemIndex % 2 != 0)
                                s.CopyFrom(altItemStyle); 
                            else
                                s.CopyFrom(itemStyle);
                            s.CopyFrom(selectedItemStyle);
                            item.MergeStyle(s); 
                        }
                        break; 
 
                    case ListItemType.EditItem:
                        // When creating the control hierarchy, we first check if the 
                        // item is in edit mode. So an item may be selected too, and
                        // so both editItemStyle (more specific) and selectedItemStyle
                        // are applied.
                        { 
                            Style s = new TableItemStyle();
 
                            if (item.ItemIndex % 2 != 0) 
                                s.CopyFrom(altItemStyle);
                            else 
                                s.CopyFrom(itemStyle);
                            if (item.ItemIndex == SelectedIndex)
                                s.CopyFrom(selectedItemStyle);
                            s.CopyFrom(editItemStyle); 
                            item.MergeStyle(s);
                        } 
                        break; 
                }
 
                TableCellCollection cells = item.Cells;
                int cellCount = cells.Count;

                if ((columnCount > 0) && (item.ItemType != ListItemType.Pager)) { 
                    int definedCells = cellCount;
 
                    if (columnCount < cellCount) 
                        definedCells = columnCount;
 
                    for (int j = 0; j < definedCells; j++) {
                        if (definedColumns[j].Visible == false) {
                            cells[j].Visible = false;
                        } 
                        else {
                            if (item.ItemType == ListItemType.Item && calculateColumns) { 
                                visibleColumns++; 
                            }
                            Style cellStyle = null; 

                            switch (item.ItemType) {
                                case ListItemType.Header:
                                    cellStyle = definedColumns[j].HeaderStyleInternal; 
                                    break;
                                case ListItemType.Footer: 
                                    cellStyle = definedColumns[j].FooterStyleInternal; 
                                    break;
                                default: 
                                    cellStyle = definedColumns[j].ItemStyleInternal;
                                    break;
                            }
                            cells[j].MergeStyle(cellStyle); 
                        }
                    } 
                    if (item.ItemType == ListItemType.Item) { 
                        calculateColumns = false;
                    } 
                }
            }
            if (Items.Count > 0 && visibleColumns != Items[0].Cells.Count && AllowPaging) {
                for (int i = 0; i < rowCount; i++) { 
                    DataGridItem item = (DataGridItem)rows[i];
                    if (item.ItemType == ListItemType.Pager && item.Cells.Count > 0) { 
                        item.Cells[0].ColumnSpan = visibleColumns; 
                    }
                } 
            }
        }

 
        /// 
        ///  
        /// Saves the current state of the . 
        /// 
        protected override object SaveViewState() { 
            object baseState = base.SaveViewState();
            object columnState = (columnCollection != null) ? ((IStateManager)columnCollection).SaveViewState() : null;
            object pagerStyleState = (pagerStyle != null) ? ((IStateManager)pagerStyle).SaveViewState() : null;
            object headerStyleState = (headerStyle != null) ? ((IStateManager)headerStyle).SaveViewState() : null; 
            object footerStyleState = (footerStyle != null) ? ((IStateManager)footerStyle).SaveViewState() : null;
            object itemStyleState = (itemStyle != null) ? ((IStateManager)itemStyle).SaveViewState() : null; 
            object alternatingItemStyleState = (alternatingItemStyle != null) ? ((IStateManager)alternatingItemStyle).SaveViewState() : null; 
            object selectedItemStyleState = (selectedItemStyle != null) ? ((IStateManager)selectedItemStyle).SaveViewState() : null;
            object editItemStyleState = (editItemStyle != null) ? ((IStateManager)editItemStyle).SaveViewState() : null; 
            object controlState = ControlStyleCreated ? ((IStateManager)ControlStyle).SaveViewState() : null;

            object[] autoGenColumnState = null;
 
            if ((autoGenColumnsArray != null) && (autoGenColumnsArray.Count != 0)) {
                autoGenColumnState = new object[autoGenColumnsArray.Count]; 
 
                for (int i = 0; i < autoGenColumnState.Length; i++) {
                    autoGenColumnState[i] = ((IStateManager)autoGenColumnsArray[i]).SaveViewState(); 
                }
            }

            object[] myState = new object[11]; 
            myState[0] = baseState;
            myState[1] = columnState; 
            myState[2] = pagerStyleState; 
            myState[3] = headerStyleState;
            myState[4] = footerStyleState; 
            myState[5] = itemStyleState;
            myState[6] = alternatingItemStyleState;
            myState[7] = selectedItemStyleState;
            myState[8] = editItemStyleState; 
            myState[9] = controlState;
            myState[10] = autoGenColumnState; 
 
            // note that we always have some state, atleast the ItemCount
            return myState; 
        }


        ///  
        /// 
        ///    Marks the starting point to begin tracking and saving changes to the 
        ///       control as part of the control viewstate. 
        /// 
        protected override void TrackViewState() { 
            base.TrackViewState();

            if (columnCollection != null)
                ((IStateManager)columnCollection).TrackViewState(); 
            if (pagerStyle != null)
                ((IStateManager)pagerStyle).TrackViewState(); 
            if (headerStyle != null) 
                ((IStateManager)headerStyle).TrackViewState();
            if (footerStyle != null) 
                ((IStateManager)footerStyle).TrackViewState();
            if (itemStyle != null)
                ((IStateManager)itemStyle).TrackViewState();
            if (alternatingItemStyle != null) 
                ((IStateManager)alternatingItemStyle).TrackViewState();
            if (selectedItemStyle != null) 
                ((IStateManager)selectedItemStyle).TrackViewState(); 
            if (editItemStyle != null)
                ((IStateManager)editItemStyle).TrackViewState(); 
            if (ControlStyleCreated)
                ((IStateManager)ControlStyle).TrackViewState();
        }
    } 
}
 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK