zoukankan      html  css  js  c++  java
  • TreeList之Extjs篇

      最近从WinForm转到了Web开发。根据界面要求。选择了比较火的Extjs,一接触到它,就和TreeList杠上了。这是一个老外写的插件。整体看来还不错。如果只是用来做数据展示的话。建议你用Extjs扩展的ColumnTree就足够了。但用来做数据编辑的话。在几列的情况下。它不能每一列都设置一个Editor,TreeGrid就要上场了。 百度了一把,还没有人写这方面的文章哦,对于这个二X树算法都避而不谈。

      首先,TreeGrid的定义模式是和Grid是相同的。

    代码
     1 var DepRecord = Ext.data.Record.create
     2 ([
     3     { name: 'DdepSN' },
     4     { name: 'DdepName' },
     5     { name: 'DdepOffTel' },
     6     { name: 'DdepExtTel' },
     7     { name: 'DdepModTel' },
     8     { name: 'DdepFax' },
     9     { name: 'DdepMemo' },
    10     { name: 'DdepShow', type: 'bool' },
    11     { name: 'Pname' },
    12     { name: '_id' },
    13     { name: '_parent' },
    14     { name: '_level' },
    15     { name: '_lft' },
    16     { name: '_rgt' },
    17     { name: '_is_leaf', type: 'bool' },
    18     { name: 'Timep' }
    19 ]);
      //TreeGrid专用的Store
    20 HyOA.FrmHRDepList.DepStore = new Ext.ux.maximgb.treegrid.NestedSetStore
    21 ({
    22     autoLoad: true,
    23     url: "./Project/System/FrmDepListService.aspx?Param=GetAllDepNode&&isHRDep=true",
    24     reader: new Ext.data.JsonReader
    25     ({ id: '_id', root: 'data', totalProperty: 'total', successProperty: 'success'
    26     }, HyOA.FrmHRDepList.DepRecord)
    27 });
    28 var DepGrid = new Ext.ux.maximgb.treegrid.EditorGridPanel
    29 ({
    30     store: DepStore,
    31     master_column_id: 'DdepSN',//重要属性。
    32     region: 'center',
    33     scope: this,
    34     columns:
    35     [
    36       { id: 'DdepSN', header: "部门编号", dataIndex: "DdepSN",  150, sortable: true, editor: new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank: false })) },
    37       { header: "部门名称", dataIndex: "DdepName",  260, sortable: true, editor: new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank: false })) },
    38       { header: '办公电话', dataIndex: 'DdepOffTel',  130, editor: new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank: false })) },
    39       { header: '电话分机', dataIndex: 'DdepExtTel',  130, editor: new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank: false })) },
    40       { header: '移动座机', dataIndex: 'DdepModTel',  130, editor: new Ext.grid.GridEditor(new Ext.form.DateField({ allowBlank: false })) },
    41       { header: '传真', dataIndex: 'DdepFax',  130, editor: new Ext.grid.GridEditor(new Ext.form.TextField({ allowBlank: false })) },
    42       { header: "备注",  130, sortable: true, dataIndex: "DdepMemo", editor: new Ext.grid.GridEditor(new Ext.form.TextField()) },
    43       { dataIndex: 'Timep', hidden: true }
    44     ],
    45     height: 220,
    46     sm: new Ext.grid.RowSelectionModel({ singleSelect: true }),
    47     stripeRows: true,
    48     enableDD: true,
    49     title: "部门分类",
    50     viewConfig: { enableRowBody: true },
    51     tbar: DepTBar
    52 });

     这样就定义好了一个TreeGrid,除了它专用的NestedSetStore,其它的都与Grid的定义一致的。在Record里面有三个重要属性,level,_lft,_rgt,对应二X树里面的左右节点概念,最后附上生成代码

    代码
        static int nFit = 0;
        Res 
    = new DataTable();
        nFit 
    = 0;
        DataColumn ColumnPid 
    = new DataColumn("Pid"typeof(int));
        DataColumn ColumnChild 
    = new DataColumn("ChildID"typeof(int));
        DataColumn ColumnLft 
    = new DataColumn("Lft"typeof(int));
        DataColumn ColumnRgt 
    = new DataColumn("Rgt"typeof(int));
        DataColumn ColumnLevel 
    = new DataColumn("Level"typeof(int));
        Res.Columns.AddRange(
    new DataColumn[] { ColumnPid, ColumnChild, ColumnLft, ColumnRgt, ColumnLevel });
        Res.PrimaryKey 
    = new DataColumn[] { ColumnChild };
        AnalyzeLftRgt();
        
    /// <summary>
        
    /// 调用上面函数,完成计算,这里用了听棠的Orm
        
    /// </summary>
        private void AnalyzeLftRgt()
        {
            nFit 
    = 0;
            
    if (Res.Rows.Count > 0) Res.Rows.Clear();
            RetrieveCriteria Tm 
    = new RetrieveCriteria(typeof(tbDepListEntity));
            Tm.DatabaseName 
    = SessionManager.GetSession("LoginBase");
            Tm.AddSelect(tbDepListEntity.__PID);
            Tm.AddSelect(tbDepListEntity.__DEPID, 
    "ChildID");
            Tm.OrderBy(tbDepListEntity.__DEPSN);
            Table 
    = Tm.AsDataTable();
            DataRow[] AllNode 
    = Table.Select("PID=0");
            
    for (int n = 0; n < AllNode.Length; n++)
            {
                DataRow Dr 
    = AllNode[n];
                
    int ID = Convert.ToInt32(Dr["ChildID"]);
                DoWork(ID, 
    0);
            }
        }
        
    /// <summary>
        
    /// 生成Lft,Rgt,Level的专用函数。
        
    /// </summary>
        public void DoWork(int ID, int Pid)
        {
            
    int Level = 1;
            DataRow PNode 
    = Res.Rows.Find(Pid);
            
    if (PNode != null)
            {
                Level 
    = Convert.ToInt32(PNode["Level"]) + 1;
            }
            DataRow New 
    = Res.NewRow();
            New[
    "Pid"= Pid;
            New[
    "ChildID"= ID;
            New[
    "Level"= Level;
            
    if (!Res.Rows.Contains(ID))
            {
                New[
    "Lft"= ++nFit;
                Res.Rows.Add(New);
            }
            DataRow[] Rows 
    = Table.Select("PID=" + ID.ToString());
            
    if (Rows.Length > 0)
            {
                
    for (int i = 0; i < Rows.Length; i++)
                {
                    DataRow Dr 
    = Rows[i];
                    
    int ChildID = Convert.ToInt32(Dr["ChildID"]);
                    DoWork(ChildID, ID);
                }
                DataRow PRow 
    = Res.Rows.Find(ID);
                
    if (PRow != null)//遍历完兄弟后给老子赋Rgt的值
                {
                    PRow[
    "Rgt"= ++nFit;
                }
            }
            
    else
            {
                
    //没有儿子,给老子赋Rgt的值
                New["Rgt"= ++nFit;
            }
        }

    最后希望用Extjs的菜鸟们能从这里得到一点帮助,不像我当时一样。是没有地方可以借鉴的。

  • 相关阅读:
    ArcGIS Engine常用网址
    【转载】C# 跨线程调用控件
    win7电脑更新显卡不兼容,造成电脑开机黑屏
    js 字符串时间比较大小
    jquery 实现 table搜索功能
    php抓取网页数据遇到的问题
    php根据修改时间删除指定目录下文件
    ubuntu18.10安装redis遇到问题
    DEV通过FindFilterText自动检索gridview内容
    dev gridview 设置分组
  • 原文地址:https://www.cnblogs.com/xxm/p/1771372.html
Copyright © 2011-2022 走看看