树样式gridview

时间:2009-12-24 08:44:57

标签: c# asp.net ajax gridview

有人知道c#web应用程序的gridview或将数据显示为树的ajax吗?

例如,我有一些关于联系人的一般信息,我想显示每一行都有额外的信息,如该联系人的活动以及隐藏或显示额外信息的能力。

订购关系数据库模型!

2 个答案:

答案 0 :(得分:0)

.NET框架提供的Web TreeView控件有什么问题?

答案 1 :(得分:0)

从inet中的任何地方获取它......我认为这是来自Dino Esposito的控制......

// The DataSource SHOULD BE a DataSet. 
// No check is implemented on this point.

namespace EnterpriseUtilities.Webcontrols
{
    /// <summary>
    /// Creates a nested data grid.
    /// </summary>
    public class NestedDataGrid : System.Web.UI.WebControls.DataGrid
    {
        /// <summary>
        /// The width.
        /// </summary>
        public Unit HostColumnWidth;
        private DataGrid detailsGrid;
        /// <summary>
        /// Gets or sets the item to render expanded.
        /// </summary>
        public int ExpandedItem
        {
            get {return Convert.ToInt32(ViewState["ExpandedItem"]);}
            set {ViewState["ExpandedItem"] = value;}
        }
        /// <summary>
        /// Gets or sets whether the child grid is scrollable or pageable
        /// </summary>
        public bool ScrollChildren
        {
            get {return Convert.ToBoolean(ViewState["ScrollChildren"]);}
            set {ViewState["ScrollChildren"] = value;}
        }
        /// <summary>
        /// Gets or sets the name of the DataSet's relation to use to fill the subgrid.
        /// </summary>
        public string RelationName
        {
            get {return Convert.ToString(ViewState["RelationName"]);}
            set {ViewState["RelationName"] = value;}
        }
        /// <summary>
        /// Fire the UpdateView event to the page for binding.
        /// </summary>
        public event EventHandler UpdateView;
        private void OnUpdateView()
        {
            if (UpdateView != null)
                UpdateView(this, EventArgs.Empty); 
        }
        /// <summary>
        /// Public ctor
        /// </summary>
        public NestedDataGrid() : base()
        {
            ExpandedItem = -1;
            HostColumnWidth = Unit.Pixel(150);
            ScrollChildren = true;

            AllowPaging = true;
            PageIndexChanged += new DataGridPageChangedEventHandler(NestedDataGrid_PageIndexChanged);
            ItemCommand += new DataGridCommandEventHandler(NestedDataGrid_ItemCommand);
            ItemDataBound += new DataGridItemEventHandler(NestedDataGrid_ItemDataBound);
        }
        /// <summary>
        /// Page change handler.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The page changed event.</param>
        private void NestedDataGrid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
        {
            CurrentPageIndex = e.NewPageIndex;
            SelectedIndex = -1;
            EditItemIndex = -1;
            ExpandedItem = -1;

            OnUpdateView();
        }
        /// <summary>
        /// Command handler.
        /// </summary>
        /// <param name="source">The sender.</param>
        /// <param name="e">The event args.</param>
        private void NestedDataGrid_ItemCommand(object source, DataGridCommandEventArgs e)
        {
            if (e.CommandName != "Expand")
                return;

            ExpandItem(e.Item);
        }
        /// <summary>
        /// Adjust the index of the expanded item.
        /// </summary>
        /// <param name="item">The item.</param>
        private void ExpandItem(DataGridItem item)
        {
            if (item.ItemIndex == (ExpandedItem % this.PageSize))
                SetExpandedItem(item, false);
            else
                SetExpandedItem(item, true);

            OnUpdateView();
        }
        /// <summary>
        /// Adjust the index of the expanded item
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="expand">If true then item is expanded.</param>
        private void SetExpandedItem(DataGridItem item, bool expand)
        {
            if (expand)
                ExpandedItem = (this.PageSize*this.CurrentPageIndex+item.ItemIndex); 
            else
                ExpandedItem = -1;
        }
        /// <summary>
        /// Opens the subtree and shows the related records.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="columns">The associated columns.</param>
        protected override void InitializeItem(DataGridItem item, DataGridColumn[] columns)
        {
            for (int i=0; i<columns.Length; i++)
            {
                TableCell cell = new TableCell();
                if (columns[i] is ExpandCommandColumn)
                    ((ExpandCommandColumn)columns[i]).InitializeCell(cell, i, item.ItemType, (item.ItemIndex==(ExpandedItem % this.PageSize)));
                else
                    columns[i].InitializeCell(cell, i, item.ItemType);
                item.Cells.Add(cell);
            }
        }
        /// <summary>
        /// Modify the layout of the cell being expanded.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The event args.</param>
        private void NestedDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e)
        {
            // Process only items and alternating items
            if (e.Item.ItemType != ListItemType.Item &&
                e.Item.ItemType != ListItemType.AlternatingItem)
                return;

            // Default if the item doesn't have to be expanded
            if (e.Item.ItemIndex != (ExpandedItem % this.PageSize))
            {
                // Instead of itemstyle-width set declaratively
                e.Item.Cells[1].Width = HostColumnWidth;

                return;
            }

            // Build the subtree
            BuildChildLayout(e.Item);
        }
        /// <summary>
        /// Modify the layout of the cell being expanded.
        /// </summary>
        /// <param name="item">The item.</param>
        private void BuildChildLayout(DataGridItem item)
        {
            DataGridItem row = item;

            // Assumes the Expand column is the first

            // Remove all cells but one
            int cellsToSpanOver = row.Cells.Count-1;
            ArrayList listOfText = new ArrayList();
            ArrayList listOfWidth = new ArrayList();
            for (int i=row.Cells.Count-1; i>0; i--)
            {
                listOfText.Add(row.Cells[i].Text);
                if (i==1) // Add the width of the column whose width is not declared
                    listOfWidth.Add(HostColumnWidth);
                else
                    listOfWidth.Add(this.Columns[i].ItemStyle.Width);
                row.Cells.RemoveAt(i);
            }

            // Add the new cell that will host the child grid
            TableCell newCell = new TableCell();
            newCell.ColumnSpan = cellsToSpanOver;
            newCell.BackColor = Color.SkyBlue;

            // MUST BE empty. If you set a fixed width declaratively that value
            // will override this one. For this reason, we set the width of the 
            // first column after the EXPAND column dynamically. We also assume
            // that the first column after the EXPAND column is the host cell, where
            // the child grid is inserted.
            newCell.Width = Unit.Empty;
            row.Cells.Add(newCell);

            // The child layout is made of a 2-row table: header (same as the 
            // previous unexpanded row) and the subgrid
            Table t = new Table();
            t.Font.Name = this.Font.Name;
            t.Font.Size = this.Font.Size;
            t.CellSpacing = this.CellSpacing;
            t.CellPadding = this.CellSpacing;
            t.BorderWidth = this.BorderWidth;

            TableRow rowHeader = new TableRow();
            t.Rows.Add(rowHeader);
            TableRow rowSubGrid = new TableRow();
            t.Rows.Add(rowSubGrid);
            newCell.Controls.Add(t);

            // Fill the header row
            for (int i=listOfText.Count-1; i>=0; i--)
            {
                TableCell c = new TableCell();
                c.Text = listOfText[i].ToString();
                c.Width = (Unit) listOfWidth[i];
                rowHeader.Cells.Add(c);
            }


            // Fill the second row
            Panel outerPanel = null;
            if (ScrollChildren)
            {
                outerPanel = new Panel();
                outerPanel.Height = Unit.Pixel(100);
                outerPanel.Style["overflow"] = "auto"; 
            }

            TableCell cellSubGrid = new TableCell();
            cellSubGrid.ColumnSpan = cellsToSpanOver;
            cellSubGrid.BackColor = Color.LightCyan;
            rowSubGrid.Cells.Add(cellSubGrid);

            detailsGrid = new DataGrid();
            detailsGrid.ID = "detailsGrid";
            detailsGrid.BackColor = Color.LightCyan;
            detailsGrid.Font.Name = this.Font.Name;
            detailsGrid.Font.Size = this.Font.Size;
            detailsGrid.HeaderStyle.Font.Bold = true; 
            detailsGrid.Width = Unit.Percentage(100);

            if (!ScrollChildren)
            {
                detailsGrid.AllowPaging = true;
                detailsGrid.PageSize = 5;
                detailsGrid.PageIndexChanged += new DataGridPageChangedEventHandler(detailsGrid_PageIndexChanged);
            }
            BindDetails(detailsGrid);

            if (ScrollChildren)
            {
                outerPanel.Controls.Add(detailsGrid);
                cellSubGrid.Controls.Add(outerPanel);
            }
            else
            {
                cellSubGrid.Controls.Add(detailsGrid);
            }
        }       
        /// <summary>
        /// Bind the child view to the subgrid.
        /// </summary>
        /// <param name="detailsGrid">The grid.</param>
        private void BindDetails(DataGrid detailsGrid)
        {
            DataSet ds = (DataSource as DataSet);
            if (ds == null)
                return;

            DataTable dt = ds.Tables[this.DataMember];
            DataView theView = new DataView(dt);
            DataRowView drv = theView[ExpandedItem];     
            DataView detailsView = drv.CreateChildView(this.RelationName);

            detailsGrid.DataSource = detailsView;
            detailsGrid.DataBind();
        }
        /// <summary>
        /// Takes care of paging the child grid.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The event args.</param>
        private void detailsGrid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
        {
            DataGrid detGrid = (DataGrid) sender;
            detGrid.CurrentPageIndex = e.NewPageIndex;
            //Page.Trace.Warn("Child grid page: " + detGrid.CurrentPageIndex.ToString());
            BindDetails(detGrid);
        }
    }
}