博客
关于我
FineUI开源版之TreeGrid实现
阅读量:421 次
发布时间:2019-03-06

本文共 6254 字,大约阅读时间需要 20 分钟。

FineUI开源版并未内置树表格功能,但通过扩展和修改,可以实现树表格的效果。本文将详细介绍如何实现树表格,并提供相应的代码示例。

1. 树表格的需求分析

FineUI默认不支持树表格,但在实际项目中可能需要显示层级化的数据结构。以下是常见需求:

  • 展开/收缩树节点
  • 显示层级信息
  • 支持点击事件(子节点跳转)
  • 自定义节点图标
  • 高效的数据绑定和排序

2. 实现树表格的关键点

2.1 树表格的核心逻辑

树表格的实现主要包含以下几个关键部分:

  • 数据处理:获取父节点、子节点的关系,计算层级信息
  • 视图更新:在UI中显示展开的节点,处理点击事件
  • 动态绑定:根据数据源实时更新树表格结构
  • 排序与过滤:支持对树表格数据进行排序

2.2 核心代码扩展

以下是FineUI Grid.cs中添加的主要代码段:

public bool EnableTree{    get    {        object obj = FState["EnableTree"];        return obj == null ? false : (bool)obj;    }    set    {        FState["EnableTree"] = value;        if (value)        {            EnableRowClickEvent = false;        }    }}public bool ExpandAll{    get    {        object obj = FState["ExpandAll"];        return obj == null ? true : (bool)obj;    }    set    {        FState["ExpandAll"] = value;        if (value)        {            EnableRowClickEvent = false;        }    }}private int GetLevelNub(GridRow row, GridRowCollection Rows){    int lub = 0;    int IDindex = FindColumn(TreeDataIDField).ColumnIndex;    int ParentIDindex = FindColumn(TreeDataParentIDField).ColumnIndex;    if (row.Values[ParentIDindex].ToString() == "" || row.Values[ParentIDindex].ToString() == "0")    {        return lub;    }    else    {        foreach (GridRow gr in Rows)        {            if (gr.Values[IDindex].ToString() == row.Values[ParentIDindex].ToString())            {                lub++;                int nub = GetLevelNub(gr, Rows);                lub += nub == 0 ? 1 : nub;            }        }    }    return lub;}private void SortTreeRows(){    List
sourceRows = new List
(); foreach (GridRow row in Rows) { sourceRows.Add(row); } Rows.Clear(); List
toList = new List
(); int pidindex = FindColumn(TreeDataParentIDField).ColumnIndex; int idindex = FindColumn(TreeDataIDField).ColumnIndex; for (int i = sourceRows.Count - 1; i >= 0; i--) { GridRow row = sourceRows[i]; if (row.Values[pidindex].ToString() == "" || row.Values[pidindex].ToString() == "0") { toList.Insert(0, row); sourceRows.RemoveAt(i); } } toList = InsertRowToList(toList, sourceRows, idindex, pidindex); toList.ForEach(p => Rows.Add(p)); for (int i = 0; i < Rows.Count; i++) { Rows[i].RowIndex = i; } toList.Clear(); toList = null;}

3. 测试页面的实现

以下是实现树表格的测试页面代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="FineUI.Examples.TestPage" %>

4. 后台代码配置

以下是后台代码的实现:

using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;namespace FineUI.Examples{    public partial class TestPage : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            DataTable dt = new DataTable();            dt.Columns.Add("name", typeof(string));            dt.Columns.Add("id", typeof(int));            dt.Columns.Add("topID", typeof(string));            dt.Columns.Add("levelcode", typeof(string));            dt.Columns.Add("levelnub", typeof(int));            dt.Columns.Add("subitem", typeof(bool));            dt.Columns.Add("url", typeof(string));            DataRow dr1 = dt.NewRow();            dr1[0] = "首页";            dr1[1] = 1;            dr1[2] = 0;            dr1[3] = "0001";            dr1[4] = 0;            dr1[5] = false;            dr1[6] = "adfsdfds";            dt.Rows.Add(dr1);            DataRow dr2 = dt.NewRow();            dr2[0] = "测试页";            dr2[1] = 2;            dr2[2] = 0;            dr2[3] = "0002";            dr2[4] = 0;            dr2[5] = false;            dr2[6] = "adfsdfds";            dt.Rows.Add(dr2);            DataRow dr11 = dt.NewRow();            dr11[0] = "首页下级1";            dr11[1] = 3;            dr11[2] = 1;            dr11[3] = "00010001";            dr11[4] = 1;            dr11[5] = true;            dr11[6] = "adfsdfds";            dt.Rows.Add(dr11);            DataRow dr12 = dt.NewRow();            dr12[0] = "首页下级2";            dr12[1] = 4;            dr12[2] = 1;            dr12[3] = "00010002";            dr12[4] = 1;            dr12[5] = true;            dr12[6] = "adfsdfds";            dt.Rows.Add(dr12);            DataRow dr13 = dt.NewRow();            dr13[0] = "首页下级3";            dr13[1] = 5;            dr13[2] = 1;            dt.Rows.Add(dr13);            DataRow dr21 = dt.NewRow();            dr21[0] = "测试页下级1";            dr21[1] = 6;            dr21[2] = 2;            dr21[3] = "00020001";            dr21[4] = 1;            dr21[5] = true;            dr21[6] = "adfsdfds";            dt.Rows.Add(dr21);            DataRow dr22 = dt.NewRow();            dr22[0] = "测试页下级2";            dr22[1] = 7;            dr22[2] = 2;            dr22[3] = "00020002";            dr22[4] = 1;            dr22[5] = true;            dr22[6] = "adfsdfds";            dt.Rows.Add(dr22);            DataRow dr221 = dt.NewRow();            dr221[0] = "测试页下下级1";            dr221[1] = 8;            dr221[2] = 7;            dr221[3] = "00020002001";            dr221[4] = 2;            dr221[5] = true;            dr221[6] = "adfsdfds";            dt.Rows.Add(dr221);            DataRow dr00 = dt.NewRow();            dr00[0] = "00测试";            dr00[1] = 8;            dr00[2] = 14;            dr00[3] = "00020002001";            dr00[4] = 2;            dr00[5] = true;            dr00[6] = "adfsdfds";            dt.Rows.Add(dr00);            Grid1.DataSource = dt;            Grid1.DataBind();        }        protected void PageManager_CustomEvent(object sender, CustomEventArgs e)        {            if (e.EventArgument.IndexOf("GridTreeClick_") >= 0)            {                string rowindex = e.EventArgument.ToString().Split('_')[1];                Grid1.DoTreeClick(rowindex);            }        }    }}

5. 树表格的实现总结

通过以上代码扩展,可以实现一个功能完善的树表格。主要包括以下功能:

  • 展开/收缩树节点
  • 层级显示
  • 点击事件处理
  • 动态数据绑定
  • 排序与过滤

建议在实际项目中根据具体需求进行调整和优化,同时注意以下几点:

  • 数据源的获取与处理
  • UI布局与样式美化
  • 性能优化(尤其是在大数据量场景下)
  • 权限控制与安全性

通过以上实现,可以在FineUI的基础上,轻松构建出满足实际需求的树表格功能。

转载地址:http://zjvkz.baihongyu.com/

你可能感兴趣的文章
noi 7827 质数的和与积
查看>>
NOIp2005 过河
查看>>
NOIP2011T1 数字反转
查看>>
NOIP2014 提高组 Day2——寻找道路
查看>>
NOIp模拟赛二十九
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>
NOPI读取Excel
查看>>
NoSQL&MongoDB
查看>>
NoSQL介绍
查看>>
Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Notepad++在线和离线安装JSON格式化插件
查看>>
notepad++最详情汇总
查看>>
notepad如何自动对齐_notepad++怎么自动排版
查看>>
Notification 使用详解(很全
查看>>
NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
查看>>
Now trying to drop the old temporary tablespace, the session hangs.
查看>>
nowcoder—Beauty of Trees
查看>>