首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> ASP.NET >> 正文

.net开发中的支持树型的GridView控件

支持树型的GridView

    实现思路: 继承自Gridview,处理gridview的数据源,使其在帮定时,就已经按照树型菜单顺序排列好,那样只需在帮定处理其图片是javascript脚本就可以了

    源代码下载http://files.cnblogs.com/wschacker/TreeListView.rar

效果图:

Code

 using System;
    using System.Data;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    using System.Web;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Design;
    using System.Reflection;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    [ToolboxData("<{0}:TreeListView runat=server></{0}:TreeListView>"), DefaultProperty("Text")]
    public class TreeListView : GridView, IPostBackDataHandler
    {
        public TreeListView()
        {
            base.AllowPaging = false;
            base.AllowSorting = false;
            base.AutoGenerateColumns = false;

        }

        Tree的属性设置#region Tree的属性设置
        private int _nodeColumnIndex;
        /**//// <summary>
        /// 显示树型的列 Index
        /// </summary>
        public int NodeColumnIndex
        {
            get { return this._nodeColumnIndex; }
            set
            {
                _nodeColumnIndex = value;
            }
        }

        private string _columnKey;
        /**//// <summary>
        /// Key字段
        /// </summary>
        public string ColumnKey
        {
            get { return _columnKey; }
            set
            {
                _columnKey = value;
            }
        }

        private string _parentKey;
        /**//// <summary>
        /// 指向父节点的字段
        /// </summary>
        public string ParentKey
        {
            set
            {
                _parentKey = value;
            }
        }

        private string _sortKey;
        /**//// <summary>
        /// 排序字段
        /// </summary>
        public string SortKey
        {
            set { _sortKey = value; }
        }

        private object _rootNodeFlag;
        /**//// <summary>
        /// 根节点的标记 这里采用 ParentKey为什么字符
        /// </summary>
        public object RootNodeFlag
        {
            set
            {
                _rootNodeFlag = value;
            }
        }

        private static string _treeImageFolder = "/Images/Tree/";
        public static string TreeImageFolder
        {
            get
            {
                return _treeImageFolder;
            }
            set
            {
                _treeImageFolder = value;
            }
        }

        private int _expendDepth = 0;
        /**//// <summary>
        /// 展开的深度
        /// </summary>
        public int ExpendDepth
        {
            get
            {
                return _expendDepth;
            }
            set { _expendDepth = value; }
        }
        #endregion

        public override object DataSource
        {
            get
            {
                return base.DataSource;
            }
            set
            {
                DataTable dtSource = new DataTable();
                if (value is DataSet && ((DataSet)value).Tables.Count > 0)
                {
                    DataSet ds = value as DataSet;
                    dtSource = OrderData(ds.Tables[0]);
                }
                else
                {
                    throw new Exception("DataSource is not DataSet!");
                }
                base.DataSource = dtSource;
            }
        }

        DataTable OrderData(DataTable dtSource)
        {
            DataTable dtResult = dtSource.Clone();
            dtResult.Columns.Add("TreeListView$Row$Depth", typeof(int));
            dtResult.Columns.Add("TreeListView$Row$IsLeaf", typeof(bool));
            dtResult.Columns.Add("TreeListView$Row$IsBottom", typeof(bool));
            dtResult.Columns.Add("TreeListView$Row$ParentRow", typeof(DataRow));
            dtResult.Columns.Add("TreeList$ViewRow$ClientID", typeof(string));
            RecursionOrderData(dtSource, dtResult, _rootNodeFlag, -1, null);
            return dtResult;
        }
        string FormatToRowFilter(object val)
        {
            Type type = val.GetType();
            if (type == typeof(string))
            {
                return string.Format("'{0}'", val.ToString().Replace("'", "''"));
            }
            else if (type == typeof(Guid))
            {
                return string.Format("'{0}'", val);
            }
            else if (type.IsValueType)
            {
                return val.ToString();
            }
            else
            {
                return string.Format("'{0}'", val.ToString().Replace("'", "''"));
            }
        }
        bool RecursionOrderData(DataTable dtSource, DataTable dtResult, object parentID, int depth, DataRow parentDatarow)
        {
            DataView dv = new DataView(dtSource);
            dv.RowFilter = string.Format("{0}={1}", _parentKey, FormatToRowFilter(parentID));
            dv.Sort = _sortKey;
            DataRow dr = null;
            depth++;
            for (int i = 0; i < dv.Count; i++)
            {
                dr = dtResult.NewRow();

                for (int j = 0; j < dv[i].Row.ItemArray.Length; j++)
                {
                    dr[j] = dv[i][j];
                }

                if (i == dv.Count - 1) //isBottom
                {
                    dr["TreeListView$Row$IsBottom"] = true;
                }
                else
                {
                    dr["TreeListView$Row$IsBottom"] = false;
                }
                dr["TreeListView$Row$Depth"] = depth;
                dr["TreeListView$Row$ParentRow"] = parentDatarow;
                if (depth == 0)
                {
                    dr["TreeList$ViewRow$ClientID"] = Guid.NewGuid().ToString();
                }
                else
                {
                    dr["TreeList$ViewRow$ClientID"] = parentDatarow["TreeList$ViewRow$ClientID"].ToString() + "/" + Guid.NewGuid().ToString();
                }

                dtResult.Rows.Add(dr);
                dr["TreeListView$Row$IsLeaf"] = !RecursionOrderData(dtSource, dtResult, dv[i][_columnKey], depth, dr);
            }

            return dv.Count > 0;
        }

        public override bool AllowPaging
        {
            get
            {
                return base.AllowPaging;
            }
            set
            {
                base.AllowPaging = false;
            }
        }

        public override bool AutoGenerateColumns
        {
            get
            {
                return base.AutoGenerateColumns;
            }
            set
            {
                base.AutoGenerateColumns = false;
            }
        }

        重载:CreateRow#region 重载:CreateRow
        protected override GridViewRow CreateRow(int rowIndex, int dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState)
        {
            return new TreeListViewRow(rowIndex, dataSourceIndex, rowType, rowState);
        }
        #endregion

    

[1] [2] 下一页

【责编:Luzi】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航