Exemple #1
0
        } // _getUniquePrefix()

        public JObject TreeToJson(string Title, CswNbtView View, ICswNbtTree Tree, bool IsPropertyGrid = false, string GroupByCol = "")
        {
            JObject Ret = new JObject();

            if (null != View)
            {
                string gridUniquePrefix = _getUniquePrefix(View);

                CswExtJsGrid grid = new CswExtJsGrid(gridUniquePrefix);
                if (string.IsNullOrEmpty(GroupByCol))
                {
                    GroupByCol = View.GridGroupByCol;
                }
                grid.groupfield = GroupByCol;
                grid.title      = Title;
                if (_CswNbtResources.CurrentNbtUser != null && _CswNbtResources.CurrentNbtUser.PageSize > 0)
                {
                    grid.PageSize = _CswNbtResources.CurrentNbtUser.PageSize;
                }

                if (IsPropertyGrid && Tree.getChildNodeCount() > 0)
                {
                    Tree.goToNthChild(0);
                }

                grid.Truncated = Tree.getCurrentNodeChildrenTruncated();

                CswExtJsGridDataIndex nodeIdDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodeId");
                {
                    CswExtJsGridField nodeIdFld = new CswExtJsGridField {
                        dataIndex = nodeIdDataIndex
                    };
                    grid.fields.Add(nodeIdFld);
                    CswExtJsGridColumn nodeIdCol = new CswExtJsGridColumn {
                        header = "Internal ID", dataIndex = nodeIdDataIndex, hidden = true
                    };
                    grid.columns.Add(nodeIdCol);
                }
                CswExtJsGridDataIndex nodekeyDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodekey");
                {
                    CswExtJsGridField nodekeyFld = new CswExtJsGridField {
                        dataIndex = nodekeyDataIndex
                    };
                    grid.fields.Add(nodekeyFld);
                    CswExtJsGridColumn nodekeyCol = new CswExtJsGridColumn {
                        header = "Internal Key", dataIndex = nodekeyDataIndex, hidden = true
                    };
                    grid.columns.Add(nodekeyCol);
                }
                CswExtJsGridDataIndex nodenameDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodename");
                {
                    CswExtJsGridField nodenameFld = new CswExtJsGridField {
                        dataIndex = nodenameDataIndex
                    };
                    grid.fields.Add(nodenameFld);
                    CswExtJsGridColumn nodenameCol = new CswExtJsGridColumn {
                        header = "Internal Name", dataIndex = nodenameDataIndex, hidden = true
                    };
                    grid.columns.Add(nodenameCol);
                }
                CswExtJsGridDataIndex NodeTypeDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "nodetypeid");
                {
                    CswExtJsGridField NodeTypeField = new CswExtJsGridField {
                        dataIndex = NodeTypeDataIndex
                    };
                    grid.fields.Add(NodeTypeField);
                    CswExtJsGridColumn NodeTypeColumn = new CswExtJsGridColumn {
                        header = "Internal Type ID", dataIndex = NodeTypeDataIndex, hidden = true
                    };
                    grid.columns.Add(NodeTypeColumn);
                }
                CswExtJsGridDataIndex ObjectClassDataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, "objectclassid");
                {
                    CswExtJsGridField ObjectClassField = new CswExtJsGridField {
                        dataIndex = ObjectClassDataIndex
                    };
                    grid.fields.Add(ObjectClassField);
                    CswExtJsGridColumn ObjectClassColumn = new CswExtJsGridColumn {
                        header = "Internal Parent Type ID", dataIndex = ObjectClassDataIndex, hidden = true
                    };
                    grid.columns.Add(ObjectClassColumn);
                }
                // View Properties determine Columns and Fields
                foreach (CswNbtViewProperty ViewProp in View.getOrderedViewProps(true))
                {
                    if (null != ViewProp)
                    {
                        ICswNbtMetaDataProp MetaDataProp = null;
                        if (ViewProp.Type == CswEnumNbtViewPropType.NodeTypePropId)
                        {
                            MetaDataProp = ViewProp.NodeTypeProp;
                        }
                        else if (ViewProp.Type == CswEnumNbtViewPropType.ObjectClassPropId)
                        {
                            MetaDataProp = ViewProp.ObjectClassProp;
                        }

                        // Because properties in the view might be by object class, but properties on the tree will always be by nodetype,
                        // we have to use name, not id, as the dataIndex
                        if (null != MetaDataProp)
                        {
                            string header = MetaDataProp.PropNameWithQuestionNo;
                            CswExtJsGridDataIndex dataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, MetaDataProp.PropName);   // don't use PropNameWithQuestionNo here, because it won't match the propname from the tree

                            // Potential bug here!
                            // If the same property is added to the view more than once, we'll only use the grid definition for the first instance
                            if (false == grid.columnsContains(header))
                            {
                                CswExtJsGridField fld = new CswExtJsGridField {
                                    dataIndex = dataIndex
                                };
                                CswExtJsGridColumn col = new CswExtJsGridColumn {
                                    header = header, dataIndex = dataIndex, hidden = (false == ViewProp.ShowInGrid)
                                };
                                switch (ViewProp.FieldType)
                                {
                                case CswEnumNbtFieldType.Button:
                                    col.MenuDisabled = true;
                                    col.IsSortable   = false;
                                    break;

                                case CswEnumNbtFieldType.Number:
                                    fld.type  = "number";
                                    col.xtype = CswEnumExtJsXType.numbercolumn;
                                    break;

                                case CswEnumNbtFieldType.DateTime:
                                    fld.type  = "date";
                                    col.xtype = CswEnumExtJsXType.datecolumn;

                                    // case 26782 - Set dateformat as client date format
                                    string dateformat      = string.Empty;
                                    string DateDisplayMode = CswEnumNbtDateDisplayMode.Date.ToString();
                                    if (ViewProp.Type == CswEnumNbtViewPropType.NodeTypePropId && ViewProp.NodeTypeProp != null)
                                    {
                                        DateDisplayMode = ViewProp.NodeTypeProp.DesignNode.getAttributeValueByName(CswNbtFieldTypeRuleDateTime.AttributeName.DateType);
                                    }
                                    else if (ViewProp.Type == CswEnumNbtViewPropType.ObjectClassPropId && ViewProp.ObjectClassProp != null)
                                    {
                                        DateDisplayMode = ViewProp.ObjectClassProp.Extended;
                                    }
                                    if (DateDisplayMode == string.Empty ||
                                        DateDisplayMode == CswEnumNbtDateDisplayMode.Date.ToString() ||
                                        DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString())
                                    {
                                        dateformat += CswTools.ConvertNetToPHP(_CswNbtResources.CurrentNbtUser.DateFormat);
                                        if (DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString())
                                        {
                                            dateformat += " ";
                                        }
                                    }
                                    if (DateDisplayMode == CswEnumNbtDateDisplayMode.Time.ToString() ||
                                        DateDisplayMode == CswEnumNbtDateDisplayMode.DateTime.ToString())
                                    {
                                        dateformat += CswTools.ConvertNetToPHP(_CswNbtResources.CurrentNbtUser.TimeFormat);
                                    }
                                    col.dateformat = dateformat;
                                    break;
                                }
                                if (ViewProp.Width > 0)
                                {
                                    col.width = ViewProp.Width * 7; // approx. characters to pixels
                                }
                                grid.columns.Add(col);
                                grid.fields.Add(fld);
                            } // if( false == grid.columnsContains( header ) )
                        }     // if(null != MetaDataProp )
                    }         // if( ViewProp != null )
                }             // foreach( CswNbtViewProperty ViewProp in View.getOrderedViewProps() )

                // Nodes in the Tree determine Rows
                for (Int32 c = 0; c < Tree.getChildNodeCount(); c++)
                {
                    CswExtJsGridRow gridrow = new CswExtJsGridRow(c, gridUniquePrefix);
                    Tree.goToNthChild(c);

                    CswNbtTreeNode TreeNode = Tree.getCurrentTreeNode();

                    gridrow.data.Add(nodeIdDataIndex, Tree.getNodeIdForCurrentPosition().ToString());
                    gridrow.data.Add(nodekeyDataIndex, Tree.getNodeKeyForCurrentPosition().ToString());
                    gridrow.data.Add(nodenameDataIndex, Tree.getNodeNameForCurrentPosition().ToString());
                    gridrow.data.Add(NodeTypeDataIndex, TreeNode.NodeTypeId.ToString());
                    gridrow.data.Add(ObjectClassDataIndex, TreeNode.ObjectClassId.ToString());

                    CswNbtMetaDataNodeType NodeType = _CswNbtResources.MetaData.getNodeType(Tree.getNodeKeyForCurrentPosition().NodeTypeId);

                    gridrow.canView = _CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.View, NodeType) &&
                                      _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.View, NodeType, Tree.getNodeIdForCurrentPosition());
                    gridrow.canEdit = (_CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.Edit, NodeType) &&
                                       (_CswNbtResources.CurrentNbtUser.IsAdministrator() ||
                                        _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.Edit,
                                                                               NodeType,
                                                                               NodeId: Tree.getNodeIdForCurrentPosition())) &&
                                       false == Tree.getNodeLockedForCurrentPosition());

                    gridrow.canDelete = (_CswNbtResources.Permit.canNodeType(CswEnumNbtNodeTypePermission.Delete,
                                                                             NodeType) &&
                                         _CswNbtResources.Permit.isNodeWritable(CswEnumNbtNodeTypePermission.Delete,
                                                                                NodeType,
                                                                                NodeId: Tree.getNodeIdForCurrentPosition())
                                         );
                    gridrow.isLocked   = Tree.getNodeLockedForCurrentPosition();
                    gridrow.isDisabled = (false == Tree.getNodeIncludedForCurrentPosition());
                    if (null != _CswNbtResources.CurrentNbtUser)
                    {
                        gridrow.isFavorite = Tree.getNodeFavoritedForCurrentPosition();
                    }

                    _TreeNodeToGrid(View, Tree, grid, gridrow);

                    Tree.goToParentNode();
                    grid.rowData.rows.Add(gridrow);
                }
                Ret = grid.ToJson();
            }
            return(Ret);
        } // TreeToJson()
Exemple #2
0
        } // _treeNodeJObject()

        public void runTree(Contract.Response.ResponseData ResponseData, Contract.Request Request, Int32 PerLevelNodeLimit = Int32.MinValue, Int32 TotalNodeLimit = Int32.MinValue)
        {
            ResponseData.Tree = ResponseData.Tree ?? new Collection <CswExtTree.TreeNode>();
            ICswNbtTree Tree     = null;
            string      RootName = string.Empty;

            if (null != _View)
            {
                Tree = _CswNbtResources.Trees.getTreeFromView(_View, Request.RequireViewPermissions, false, false, PerLevelNodeLimit: PerLevelNodeLimit);
                _View.SaveToCache(Request.IncludeInQuickLaunch);
                RootName = _View.ViewName;
            }

            CswPrimaryKey IncludeNodeId     = null;
            CswNbtNodeKey SelectKey         = null;
            Int32         IncludeNodeTypeId = Int32.MinValue;

            if (null != Request.IncludeNodeKey)
            {
                IncludeNodeId     = Request.IncludeNodeKey.NodeId;
                IncludeNodeTypeId = Request.IncludeNodeKey.NodeTypeId;
                if (null != Tree)
                {
                    Tree.makeNodeCurrent(Request.IncludeNodeKey);
                    if (Tree.isCurrentNodeDefined())
                    {
                        SelectKey = Request.IncludeNodeKey;
                    }
                }
            }
            else if (CswTools.IsPrimaryKey(Request.IncludeNodeId))
            {
                IncludeNodeId = Request.IncludeNodeId;
                CswNbtNode IncludeNode = _CswNbtResources.Nodes[IncludeNodeId];
                if (null != IncludeNode)
                {
                    IncludeNodeTypeId = IncludeNode.NodeTypeId;
                }
                if (null != Tree)
                {
                    SelectKey = Tree.getNodeKeyByNodeId(IncludeNodeId);
                }
            }

            if ((CswTools.IsPrimaryKey(IncludeNodeId) && IncludeNodeTypeId != Int32.MinValue) &&
                (Tree == null ||
                 (Request.IncludeNodeRequired && SelectKey == null)))
            {
                CswNbtMetaDataNodeType IncludeNodeType = _CswNbtResources.MetaData.getNodeType(IncludeNodeTypeId);
                if (null != IncludeNodeType)
                {
                    _View          = IncludeNodeType.CreateDefaultView(false);
                    _View.ViewName = IncludeNodeType.NodeTypeName;
                    _View.Root.ChildRelationships[0].NodeIdsToFilterIn.Add(IncludeNodeId);
                    _View.SaveToCache(Request.IncludeInQuickLaunch);   // case 22713
                    RootName = _View.ViewName;

                    Tree = _CswNbtResources.Trees.getTreeFromView(_View, false, false, false);
                }
            }

            bool HasResults = false;

            if (null != Tree)
            {
                Tree.goToRoot();
                HasResults = (Tree.getChildNodeCount() > 0);
                //ReturnObj["result"] = HasResults.ToString().ToLower();
                //ReturnObj["types"] = getTypes();
                ResponseData.PageSize = _CswNbtResources.CurrentNbtUser.PageSize;

                ResponseData.SelectedNodeKey = null;
                if (HasResults)
                {
                    // Determine the default selected node:
                    // If the requested node to select is on the tree, return it.
                    // If the requested node to select is not on the tree, return the first child of the root.
                    if (SelectKey != null)
                    {
                        Tree.makeNodeCurrent(SelectKey);
                        if (Tree.isCurrentNodeDefined())
                        {
                            ResponseData.SelectedNodeKey = SelectKey;
                        }
                    }
                    if (ResponseData.SelectedNodeKey == null)
                    {
                        switch (Request.DefaultSelect)
                        {
                        case "none":
                            break;

                        case "root":
                            break;

                        case "firstchild":
                            Tree.goToRoot();
                            CswNbtNodeKey CurrentKey = Tree.getNodeKeyForCurrentPosition();
                            while (CurrentKey != null &&
                                   CurrentKey.NodeSpecies != CswEnumNbtNodeSpecies.Plain &&
                                   Tree.getChildNodeCount() > 0)
                            {
                                Tree.goToNthChild(0);
                                CurrentKey = Tree.getNodeKeyForCurrentPosition();
                            }
                            if (CurrentKey != null && CurrentKey.NodeSpecies == CswEnumNbtNodeSpecies.Plain)
                            {
                                ResponseData.SelectedNodeKey = CurrentKey;
                            }
                            break;
                        } // switch( DefaultSelect )
                    }     // if( ReturnObj["selectid"] == null )
                }         // if( HasResults )
                else
                {
                    Request.DefaultSelect = "root";
                }

                Tree.goToRoot();
            }
            //Build the Response:

            ResponseData.Name = RootName;

            //#1: the Root node
            CswExtTree.TreeNode RootNode = new CswExtTree.TreeNode();
            ResponseData.Tree.Add(RootNode);

            RootNode.Name     = RootName;
            RootNode.IsRoot   = true;
            RootNode.Expanded = true;
            RootNode.Path     = "|root";
            RootNode.Id       = "root";
            RootNode.Icon     = "Images/view/viewtree.gif";

            //#2: the columns for the Tree Grid
            ResponseData.Columns.Add(new CswExtJsGridColumn
            {
                dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, "text"),
                xtype        = CswEnumExtJsXType.treecolumn,
                MenuDisabled = true,
                width        = 269,
                header       = "Tree",
                resizable    = false,
            });
            ResponseData.Columns.Add(new CswExtJsGridColumn
            {
                dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, "nodetypeid"),
                header       = "NodeTypeId",
                hidden       = true,
                resizable    = false,
                width        = 0,
                xtype        = CswEnumExtJsXType.gridcolumn,
                MenuDisabled = false
            });
            ResponseData.Columns.Add(new CswExtJsGridColumn
            {
                dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, "objectclassid"),
                header       = "ObjectClassId",
                hidden       = true,
                resizable    = false,
                width        = 0,
                xtype        = CswEnumExtJsXType.gridcolumn,
                MenuDisabled = false
            });
            ResponseData.Columns.Add(new CswExtJsGridColumn
            {
                dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, "nodeid"),
                header       = "NodeId",
                hidden       = true,
                resizable    = false,
                width        = 0,
                xtype        = CswEnumExtJsXType.gridcolumn,
                MenuDisabled = false
            });
            ResponseData.Columns.Add(new CswExtJsGridColumn
            {
                dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, "disabled"),
                header       = "Disabled",
                hidden       = true,
                resizable    = false,
                width        = 0,
                xtype        = CswEnumExtJsXType.booleancolumn,
                MenuDisabled = false
            });


            //#3: The fields to map the columns to the data store
            ResponseData.Fields.Add(new CswExtJsGridField {
                name = "text", type = "string"
            });
            ResponseData.Fields.Add(new CswExtJsGridField {
                name = "nodetypeid", type = "string"
            });
            ResponseData.Fields.Add(new CswExtJsGridField {
                name = "objectclassid", type = "string"
            });
            ResponseData.Fields.Add(new CswExtJsGridField {
                name = "nodeid", type = "string"
            });
            ResponseData.Fields.Add(new CswExtJsGridField {
                name = "disabled", type = "bool"
            });

            //#4: View Properties are columns now too
            Collection <string> UniqueColumnNames = new Collection <string>()
            {
                "text", "nodetypeid", "objectclassid", "nodeid", "disabled"
            };

            CswNbtViewRoot.forEachProperty AddProp = (ViewProperty) =>
            {
                string PropName = ViewProperty.Name.ToLower().Trim();
                bool   HideProp = (null != Request.PropsToShow && false == Request.PropsToShow.Contains(PropName));
                if (false == UniqueColumnNames.Contains(PropName))
                {
                    UniqueColumnNames.Add(PropName);

                    CswExtJsGridColumn Col = new CswExtJsGridColumn
                    {
                        dataIndex    = new CswExtJsGridDataIndex(_View.ViewName, PropName),
                        header       = ViewProperty.Name,
                        hidden       = HideProp,
                        resizable    = false,
                        width        = ViewProperty.Width * 7,
                        xtype        = CswEnumExtJsXType.gridcolumn,
                        MenuDisabled = false
                    };
                    CswExtJsGridField Fld = new CswExtJsGridField {
                        name = PropName, type = "string"
                    };
                    Fld.dataIndex = Col.dataIndex;

                    ResponseData.Columns.Add(Col);
                    ResponseData.Fields.Add(Fld);
                }
            };
            _View.Root.eachRelationship(relationshipCallBack: null, propertyCallBack: AddProp);


            //#5: the tree
            RootNode.Children = new Collection <CswExtTree.TreeNode>();
            if (HasResults)
            {
                Tree.goToRoot();
                int count = 0;
                _runTreeNodesRecursive(Tree, RootNode.Children, RootNode, Request, TotalNodeLimit, ref count);

                if (Int32.MinValue != TotalNodeLimit && count >= TotalNodeLimit && RootNode.Children[0].Name != "Results Truncated")
                {
                    CswExtTree.TreeNode TruncatedTreeNode = _getTreeNode(Tree, RootNode, null);
                    TruncatedTreeNode.Name   = "Results Truncated";
                    TruncatedTreeNode.IsLeaf = true;
                    TruncatedTreeNode.Icon   = "Images/icons/truncated.gif";
                    TruncatedTreeNode.Id     = TruncatedTreeNode.Id + "_truncated";
                    TruncatedTreeNode.NodeId = "";
                    RootNode.Children.Insert(0, TruncatedTreeNode);
                }
            }
            else
            {
                CswExtTree.TreeNode EmptyNode = new CswExtTree.TreeNode();
                EmptyNode.Name     = "No Results";
                EmptyNode.IsLeaf   = true;
                EmptyNode.Selected = true;
                EmptyNode.Id       = "empty";
                EmptyNode.ParentId = RootNode.Id;
                EmptyNode.Path     = RootNode.Path + "|empty";
                RootNode.Children.Add(EmptyNode);
            }
            //}
        } // runTree()
Exemple #3
0
        } // _TreeNodeToGrid()

        public CswExtJsGrid DataTableToGrid(DataTable DT, bool Editable = false, string GroupByCol = "", CswEnumExtJsXType GroupByColType = null, bool IncludeEditFields = true, Dictionary <string, Type> ColumnTypeOverrides = null)
        {
            string NodeIdColName      = "nodeid";
            string MenuOptionsColName = "menuoptions";
            string gridUniquePrefix   = DT.TableName;

            CswExtJsGrid grid = new CswExtJsGrid(gridUniquePrefix, IncludeEditFields);

            grid.groupfield = GroupByCol;
            grid.title      = DT.TableName;
            if (_CswNbtResources.CurrentNbtUser != null && _CswNbtResources.CurrentNbtUser.PageSize > 0)
            {
                grid.PageSize = _CswNbtResources.CurrentNbtUser.PageSize;
            }

            //CswExtJsGridDataIndex nodeIdDataIndex = new CswExtJsGridDataIndex( gridUniquePrefix, NodeIdColName );
            //{
            //    CswExtJsGridField nodeIdFld = new CswExtJsGridField { dataIndex = nodeIdDataIndex };
            //    grid.fields.Add( nodeIdFld );
            //    CswExtJsGridColumn nodeIdCol = new CswExtJsGridColumn { header = "nodeId", dataIndex = nodeIdDataIndex, hidden = true };
            //    grid.columns.Add( nodeIdCol );
            //}


            foreach (DataColumn CurrentColumn in DT.Columns)
            {
                Type CurrentColumnType = null;
                if (null != ColumnTypeOverrides)
                {
                    if (false == ColumnTypeOverrides.ContainsKey(CurrentColumn.ColumnName))
                    {
                        CurrentColumnType = CurrentColumn.DataType;
                    }
                    else
                    {
                        CurrentColumnType = ColumnTypeOverrides[CurrentColumn.ColumnName];
                    }
                }
                else
                {
                    CurrentColumnType = CurrentColumn.DataType;
                }


                CswExtJsGridDataIndex dataIndex = new CswExtJsGridDataIndex(gridUniquePrefix, CurrentColumn.ColumnName);
                CswExtJsGridField     fld       = new CswExtJsGridField();
                grid.fields.Add(fld);
                fld.dataIndex = dataIndex;

                CswExtJsGridColumn gridcol = new CswExtJsGridColumn();
                gridcol.header    = CurrentColumn.ColumnName;
                gridcol.dataIndex = dataIndex;
                gridcol.width     = Math.Max(100, (7 + CurrentColumn.ColumnName.Length * 8));

                if ((NodeIdColName.ToLower() == CurrentColumn.ColumnName.ToLower()) || (MenuOptionsColName.ToLower() == CurrentColumn.ColumnName.ToLower()))
                {
                    gridcol.hidden = true;
                }

                if (CurrentColumnType == typeof(string))
                {
                    fld.type = "string";
                }
                else if (CurrentColumnType == typeof(bool))
                {
                    fld.type      = "bool";
                    gridcol.xtype = CswEnumExtJsXType.booleancolumn;
                }
                else if (CurrentColumnType == typeof(Int32) ||
                         (GroupByColType != null &&
                          CurrentColumn.ColumnName.ToLower().Equals(GroupByCol.ToLower()) &&
                          GroupByColType.Equals(CswEnumExtJsXType.numbercolumn)))
                {
                    fld.type       = "number";
                    gridcol.xtype  = CswEnumExtJsXType.numbercolumn;
                    gridcol.Format = "0";
                }
                else if (CurrentColumnType == typeof(DateTime) ||
                         (GroupByColType != null &&
                          CurrentColumn.ColumnName.ToLower().Equals(GroupByCol.ToLower()) &&
                          GroupByColType.Equals(CswEnumExtJsXType.datecolumn)))
                {
                    string userDateFormat = _CswNbtResources.CurrentNbtUser.DateFormat;
                    string userTimeFormat = _CswNbtResources.CurrentNbtUser.TimeFormat;
                    gridcol.dateformat = CswTools.ConvertNetToPHP(userDateFormat) + " " + CswTools.ConvertNetToPHP(userTimeFormat);

                    fld.type       = "date";
                    gridcol.xtype  = CswEnumExtJsXType.datecolumn;
                    gridcol.Format = "m/d/y H:i:s";
                }
                else if (CurrentColumnType == typeof(sbyte))    //sbyte indidcates a "button" column :-(
                {
                    gridcol.xtype        = CswEnumExtJsXType.gridcolumn;
                    gridcol.MenuDisabled = true;
                    gridcol.IsSortable   = false;
                }

                grid.columns.Add(gridcol);
            }

            Int32 RowNo = 0;

            foreach (DataRow Row in DT.Rows)
            {
                CswExtJsGridRow gridrow = new CswExtJsGridRow(RowNo, gridUniquePrefix);

                string NodeIdForGridRowData = string.Empty;
                foreach (DataColumn CurrentColumn in DT.Columns)
                {
                    Type CurrentColumnType = null;
                    if (null != ColumnTypeOverrides)
                    {
                        if (false == ColumnTypeOverrides.ContainsKey(CurrentColumn.ColumnName))
                        {
                            CurrentColumnType = CurrentColumn.DataType;
                        }
                        else
                        {
                            CurrentColumnType = ColumnTypeOverrides[CurrentColumn.ColumnName];
                        }
                    }
                    else
                    {
                        CurrentColumnType = CurrentColumn.DataType;
                    }


                    CswExtJsGridDataIndex index = null;

                    index = new CswExtJsGridDataIndex(gridUniquePrefix, CurrentColumn.ColumnName);
                    gridrow.data[index] = CswConvert.ToString(Row[CurrentColumn]);

                    if (Row.Table.Columns.Contains(NodeIdColName) && DBNull.Value != Row[NodeIdColName] && typeof(sbyte) == CurrentColumnType)
                    {
                        string MenuOptions = string.Empty;
                        if (Row.Table.Columns.Contains(MenuOptionsColName))
                        {
                            MenuOptions = Row[MenuOptionsColName].ToString();
                        }

                        NodeIdForGridRowData = Row[NodeIdColName].ToString();
                        CswExtJsGridButton CurrentButton = new CswExtJsGridButton
                        {
                            DataIndex    = index.ToString(),
                            RowNo        = RowNo,
                            MenuOptions  = MenuOptions,
                            SelectedText = CurrentColumn.ColumnName,
                            PropAttr     = NodeIdForGridRowData
                        };                                    //nu the button

                        grid.rowData.btns.Add(CurrentButton); //add the button
                    }//if it's the hi-jacked data tabe that means BUTTON
                }//iterate collumns

                grid.rowData.rows.Add(gridrow);
                RowNo += 1;
            } // foreach( DataRow Row in DT.Rows )

            return(grid);
        } // DataTableToGrid()