Spread树形结构显示方案

发布时间:2013/03/22 00:03 发布者:jian

返回博客中心

Spread for ASP.NET中提供了级联和分组两种形势显示树形结构的数据,今天将讲解如何扩展Spread实现平铺的树形结构。要使用Spread实现平铺的树形结构,我们需要扩展单元格类型,在单元格类型中完成数据的缩进、节点图片、节点单击事件等操作。

实现我们定义树形结构的节点实体类型,代码如下:

    /// 
    /// BOM 实体类型
    /// 
    [Serializable]
    public class BOM
    {
        /// 
        /// ID
        /// 
        public int ID
        { get; set; }

        /// 
        /// 上级ID
        /// 
        public int ParentID
        { get; set; }

        /// 
        /// 编号
        /// 
        public string Code
        { get; set; }

        /// 
        /// 层级
        /// 
        public int Level
        { get; set; }

        // 行号
        public int RowNo
        { get; set; }

        /// 
        /// 行的折叠/张开状态
        /// 
        public int Expand
        { get; set; }


        public static List BuildTree(DataTable data)
        {
            List tree = new List();
            foreach (DataRow row in data.Rows)
            {
                BOM item = new BOM();
                item.ID = int.Parse(row["ID"].ToString());
                item.ParentID = int.Parse(row["ParentID"].ToString());
                item.Code = row["编号"].ToString();
                item.Level = int.Parse(row["层级"].ToString());
                item.RowNo = int.Parse(row["行号"].ToString());
                item.Expand = 1;
                tree.Add(item);
            }
            return tree;
        }
    }

 

然后,我们创建自定义的节点单元格类型,代码如下:

    /// 
    /// BOM单元格类型
    /// 
    [Serializable]
    public class BOMCellType : FarPoint.Web.Spread.GeneralCellType
    {
        /// 
        /// 存放当前数据集中的 BOM 结构
        /// 
        public List BOMItems;

        public BOMCellType()
        {
            BOMItems = new List();            
        }

        // 绘制 BOM 单元格的显示外观
        public override Control PaintCell(string id, TableCell parent, FarPoint.Web.Spread.Appearance style, FarPoint.Web.Spread.Inset margin, object value, bool upperLevel)
        {
            BOM item = BOMItems.Where(s => s.ID == int.Parse(value.ToString())).First();

            Table table = new Table();
            TableRow row = new TableRow();

            // 节点缩进
            TableCell cell0 = new TableCell();
            cell0.Width = 50 * item.Level;

            // 节点图标
            TableCell cell1 = new TableCell();

            string url = GetImage(item);
            if (url != "")
            {
                // 当前节点有子节点,需要设置当前节点的显示图片
                cell0.Width = 50 * item.Level - (item.Level == 0 ? 0 : 16);
                System.Web.UI.WebControls.Image image = new System.Web.UI.WebControls.Image();
                image.ImageUrl = url;
                image.Attributes.Add("onclick", string.Format("NodeClick({0},{1})", item.ID, (item.Expand == 1 ? 0 : 1)));
                cell1.Controls.Add(image);
            }
            
            // 添加缩进
            row.Cells.Add(cell0);

            // 添加节点图片
            row.Cells.Add(cell1);

            // 节点文本
            TableCell cell2 = new TableCell();
            Label label = new Label();
            label.Text = item.Code;
            cell2.Controls.Add(label);
            row.Cells.Add(cell2);

            table.Rows.Add(row);

            return table;
        }

        // 返回节点图片地址
        private string GetImage(BOM item)
        {
            string url = "";

            var nodes = BOMItems.Where(s => s.ParentID == item.ID).Count();

            if (nodes > 0)
            {
                if (item.Expand == 1)
                    url = @"Icon\Expand.gif";
                else
                    url = @"Icon\Collapse.gif";
            }

            return url;
        }
    }

 

运行截图:

SpreadTree

源码下载:

Spread_BOM.zip (144.55 kb)


关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网