iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >C#递归应用之如何实现JS文件的自动引用
  • 447
分享到

C#递归应用之如何实现JS文件的自动引用

2023-07-05 11:07:33 447人浏览 薄情痞子
摘要

这篇文章主要介绍了C#递归应用之如何实现js文件的自动引用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#递归应用之如何实现JS文件的自动引用文章都会有所收获,下面我们一起来看看吧。背景两张表,分别是 :sy

这篇文章主要介绍了C#递归应用之如何实现js文件的自动引用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#递归应用之如何实现JS文件的自动引用文章都会有所收获,下面我们一起来看看吧。

    背景

    两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张表中的字段 的名称(field)和描述信息(table) , 

    截图如下:

    sys_tbl

    C#递归应用之如何实现JS文件的自动引用

    C#递归应用之如何实现JS文件的自动引用

    其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如:einventory_cinvcode,就是对表 e_inventory 中字段 cinvcode的引用。

    每张表都在系统 中对应有不同功能的js文件(模块)如: 编辑窗体(dialog类型),跨域选择窗体(field)类型等

    需求

    在一个综合的页面中,会对其它对象进行引用(依赖),而这种引用最终体现在对js文件的包含。同时被引用的js 文件(一级引用)还有自已关联对象(二级引用).....如此下去,直到N 级引用。

    所以现在需要逐层找到对象的引用,直到最后不依赖任何对象为止,并把这些js文件生成引用包含路径(不重复)

    分析

    1、返回结果类型

    得到这些js引用,不能重复,但是对象之间引用是可以存在交叉的,在整个引用链条上,同一个对象会被 多个对象引用,所以简单的字符串数组是避免不了重复的。但是在C#中的HashSet可以做到不重复,同时这个去重工作是自动完成的,所以存结果如果是简单的value类型,用 HashSet就可以,但是因为字段中表的信息已经被格式化过,所以还要把格式化之前的表名称取出与字段对应,所以需要一个key-value类型的数据 ,那就是 Dictionary<string, string> 了。

    2、算法选择

    因为查找引用,是层层进行的,而且下一层引用的要用到上一层的引用结果,所以这里选择递归算法

    代码实现

    声明一个全局变量,记录所有的表与字段的对应的数据,因为需要确保数据key 唯一性所以选择Dicctionary类型

    /// <summary>        /// define the gloable parameter to save the rel obj data        /// </summary>        public static Dictionary<string, string> <strong>deepRef </strong>= new Dictionary<string, string>();

    入口函数,完成准备工作,(数据库连接,参数准备)

    /// <summary>        /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止        /// </summary>        /// <param name="headField">表字段列表</param>        /// <returns></returns>        public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)        {            HashSet<string> refset = new HashSet<string>();           // HashSet<string> refset_result = new HashSet<string>();            foreach (var item in headField)            {                if (!item.controlType.StartsWith("hz_"))// is not the field of  reference                {                    continue;                }                string[] fieldarr = item.dataindex.Split('_');//the constructor is :[tabble]_[field]                refset.Add(fieldarr[0]);//the first prefix            }            dataoperate dao = new dataOperate();            dao.DBServer = "info";            sqlConnection conn = dao.createCon();            try            {                if (refset.Count > 0)                {                                        if (conn.State != ConnectionState.Open)                        conn.Open();//open connection                    deepRef = new Dictionary<string, string>();//clear the relation obj data                    getRef(conn, refset);                                 }                return deepRef;            }            catch (Exception)            {                throw;            }            finally            {                if (conn.State == ConnectionState.Open)                    conn.Close();            }        }

    递归函数,最终完成在数据库中获取字段依赖的对象的获取

    /// <summary>        /// get the relation obj         /// </summary>        /// <param name="conn"></param>        /// <param name="ref_field"></param>        /// <returns></returns>        public static HashSet<string> <strong>getRef</strong>(SqlConnection conn, HashSet<string> ref_field)        {            HashSet<string> refset = new HashSet<string>();            string refstr = string.Join("','", ref_field);            if (refstr != "")            {                refstr = "'" + refstr + "'";                string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";                //get dataset relation obj                DataSet ds = dataOperate.getDataset(conn, sql);                if (ds != null && ds.Tables.Count > 0)                {                    DataTable dt = ds.Tables[0];                    if (dt.Rows.Count > 0)                    {                        //rel ref exists                        for (int k = 0; k < dt.Rows.Count; k++)                        {                            string vt = dt.Rows[k].ItemArray[0].ToString();                             string vv = dt.Rows[k].ItemArray[1].ToString();                            refset.Add(vt);//save current ref                            if(!<strong>deepRef</strong>.ContainsKey(vt))                                <strong>deepRef</strong>.Add(vt, vv);// save all ref                                                     }                        if (refset.Count > 0)// get the ref successfully                        {                            //recursion get                            getRef(conn, refset);                        }                    }                }            }            else            {                 //no ref            }            return refset;        }

    对函数进行调用,并组织出js文件引用路径

    Dictionary<string,string> deepRef = ExtjsFun.getRelRef(HeadfieldSetup);            if (deepRef != null)            {                foreach (var s in deepRef)                {                    string tem_module = "";                    tem_module = s.Value;                    string[] moduleArr = tem_module.Split('_');                    if (tem_module.IndexOf("_") >= 0)                        tem_module = moduleArr[1];//module name for instance: p_Machine ,the module is “machine” unless not included the underscore                    string fieldkind = "dialog";                    jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");                    fieldkind = "field";                    jslist.Add(MyComm.getFirstUp(tem_module) + "/" + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + ".js");                }            }

    最终结果 如下:

    <script src="../../dept/demoApp/scripts/Sprice/SpriceE_spriceGridfield.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Org/OrgE_orgDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Unit/UnitE_unitDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Unit/UnitE_unitField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Wh/WhWh_whDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Wh/WhWh_whField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Mold/MoldP_moldDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Mold/MoldP_moldField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/SuppliercateGory/SuppliercategoryOa_suppliercategoryDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Bank/BankOa_bankDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Bank/BankOa_bankField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Machine/MachineP_machineDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Machine/MachineP_machineField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Inventory/InventoryE_inventoryDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeField.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Tax/TaxE_taxDialog.js" type="text/javascript"></script>      <script src="../../dept/demoApp/scripts/Tax/TaxE_taxField.js" type="text/javascript"></script>

    完事代码如下:

    /// <summary>        /// define the gloable parameter to save the rel obj data        /// </summary>        public static Dictionary<string, string> deepRef = new Dictionary<string, string>();        /// <summary>        /// 通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止        /// </summary>        /// <param name="headField">表字段列表</param>        /// <returns></returns>        public static Dictionary<string,string>  getRelRef(List<IniItemsTableItem> headField)        {            HashSet<string> refset = new HashSet<string>();           // HashSet<string> refset_result = new HashSet<string>();            foreach (var item in headField)            {                if (!item.controlType.StartsWith("hz_"))// is not the field of  reference                {                    continue;                }                string[] fieldarr = item.dataIndex.Split('_');//the constructor is :[tabble]_[field]                refset.Add(fieldarr[0]);//the first prefix            }            dataOperate dao = new dataOperate();            dao.DBServer = "info";            SqlConnection conn = dao.createCon();            try            {                if (refset.Count > 0)                {                                        if (conn.State != ConnectionState.Open)                        conn.Open();//open connection                    deepRef = new Dictionary<string, string>();//clear the relation obj data                    getRef(conn, refset);                                 }                return deepRef;            }            catch (Exception)            {                throw;            }            finally            {                if (conn.State == ConnectionState.Open)                    conn.Close();            }                    }               /// <summary>        /// get the relation obj         /// </summary>        /// <param name="conn"></param>        /// <param name="ref_field"></param>        /// <returns></returns>        public static HashSet<string> getRef(SqlConnection conn, HashSet<string> ref_field)        {            HashSet<string> refset = new HashSet<string>();            string refstr = string.Join("','", ref_field);            if (refstr != "")            {                refstr = "'" + refstr + "'";                string sql = "SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (" + refstr + ") and uitype='ref'";                //get dataset relation obj                DataSet ds = dataOperate.getDataset(conn, sql);                if (ds != null && ds.Tables.Count > 0)                {                    DataTable dt = ds.Tables[0];                    if (dt.Rows.Count > 0)                    {                        //rel ref exists                        for (int k = 0; k < dt.Rows.Count; k++)                        {                            string vt = dt.Rows[k].ItemArray[0].ToString();                             string vv = dt.Rows[k].ItemArray[1].ToString();                            refset.Add(vt);//save current ref                            if(!deepRef.ContainsKey(vt))                                deepRef.Add(vt, vv);// save all ref                                                     }                        if (refset.Count > 0)// get the ref successfully                        {                            //recursion get                            getRef(conn, refset);                        }                    }                }            }            else            {                 //no ref            }            return refset;        }

    关于“C#递归应用之如何实现JS文件的自动引用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#递归应用之如何实现JS文件的自动引用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: C#递归应用之如何实现JS文件的自动引用

    本文链接: https://www.lsjlt.com/news/351392.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C#递归应用之如何实现JS文件的自动引用
      这篇文章主要介绍了C#递归应用之如何实现JS文件的自动引用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#递归应用之如何实现JS文件的自动引用文章都会有所收获,下面我们一起来看看吧。背景两张表,分别是 :sy...
      99+
      2023-07-05
    • C#递归应用之实现JS文件的自动引用
      目录背景需求分析1、返回结果类型2、算法选择代码实现背景 两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code...
      99+
      2023-03-11
      C#递归实现JS文件引用 C#递归 C# JS文件引用 C# 文件引用
    • C++ 函数的递归实现:尾递归在实际应用中的示例?
      c++++中的尾递归优化:尾递归是一种函数在调用自身后立即返回的优化技术。通过指定noinline关键字,可在c++中实现尾递归,提高性能。实战案例:使用尾递归计算阶乘,该阶乘定义为从1...
      99+
      2024-04-22
      c++ 递归
    • C++ 函数的递归实现:递归在编程竞赛中的应用?
      递归是一种函数调用自身解决问题的技术,包含基线条件以终止递归。在 c++++ 中,可使用关键字 return 返回函数值并终止递归。递归可用于解决经典问题,如汉诺塔问题,其中它将 n 个...
      99+
      2024-04-22
      c++ 递归
    • C++ 函数的递归实现:如何使用尾递归优化技术?
      递归函数的效率问题可以通过尾递归优化 (tc++o) 技术解决。c++ 编译器虽然不支持 tco,但可以通过 [__tail_recursive](https://en.cpprefer...
      99+
      2024-04-22
      c++ 递归
    • 使用 Python 实现文件递归遍历的
      今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现。 先发出来看看: def getallfiles(dir): ""...
      99+
      2023-01-31
      递归 遍历 文件
    • C++ 函数的递归实现:递归在语言分析中的应用示例?
      递归是一种函数在自身内部调用自身的编程范式。在 c++++ 中,可使用 operator() 运算符实现递归。递归在语言分析中可用作分析嵌套结构的工具,例如识别括号序列的合法性:如果序列...
      99+
      2024-04-22
      函数 c++ 递归
    • C++ 函数的递归实现:如何使用递归来解决数学问题?
      递归是一种函数调用自身的编程技巧,用于解决复杂问题。在数学问题中,递归应用广泛,例如:计算阶乘:fac++torial(n) = n * factorial(n-1) if n >...
      99+
      2024-04-22
      c++ 递归 堆栈溢出
    • C#如何实现递归调用的Lambda表达式
      这篇文章主要讲解了“C#如何实现递归调用的Lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现递归调用的Lambda表达式”吧!首先给一个简单的示例: &n...
      99+
      2023-07-02
    • C++ 函数的递归实现:如何使用备忘录技术优化递归?
      优化递归的备忘录技术:使用备忘录存储已计算结果,避免重复计算。在 c++++ 中使用 unordered_map 作为备忘录,在计算前检查是否存在结果。存储计算结果后返回,提高遍历目录等...
      99+
      2024-04-22
      递归 备忘录 c++
    • C++ 函数的递归实现:递归在计算机图形学中的应用示例?
      递归在计算机图形学中有广泛应用,包括生成分形(使用递归函数生成自相似几何形状):例如,科赫曲线分形是通过一个递归函数绘制的,该函数每次调用时生成原始形状的较小版本。递归还用于遍历场景图,...
      99+
      2024-04-23
      函数 递归 c++
    • C语言递归在实践题目中如何应用
      本篇内容主要讲解“C语言递归在实践题目中如何应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言递归在实践题目中如何应用”吧!递归知识点递归概念:程序调用自身的编程技巧称为递归( recur...
      99+
      2023-06-30
    • C++ 函数的递归实现:如何使用递归来构建复杂数据结构?
      使用递归可以构建复杂的数据结构,如二叉树。递归算法通过分解问题并调用自身来解决复杂的子问题。尽管递归算法简洁高效,但需要注意可能发生的堆栈溢出和性能问题。 C++ 函数的递归实现:构建...
      99+
      2024-04-22
      数据结构 递归 c++ 堆栈溢出
    • Python递归文件中os模块的实际应用方式
      本篇内容主要讲解“Python递归文件中os模块的实际应用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python递归文件中os模块的实际应用方式”吧!os模块在实际的操作中应用非常广泛,...
      99+
      2023-06-17
    • 如何使用C++递归实现选择排序算法
      这篇文章主要介绍了如何使用C++递归实现选择排序算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本思想每次找出最小元素,通过交换实现将其放在乱序的首位,直到所有元素都已经...
      99+
      2023-06-22
    • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)
      A:首先先看下一个简单的面试题斐波那契数列计算数组{1,1,2,3,5,8.......} 第30位值规律:1 1 从第三项开始,每一项都是前两项之和    有两种实现方式 第一种方式:public ...
      99+
      2023-05-31
      mybatis 递归 联动
    • C++ 函数的递归实现:如何在不同的数据结构上有效使用递归?
      递归在 c++++ 中有效地处理了数据结构,具体如下:数组:轻松计算和值和找到最大值链表:有效计算长度和反转链表树:快速计算高度和先序遍历 C++ 函数的递归实现:有效应用于数据结构 ...
      99+
      2024-04-22
      数据结构 递归 c++
    • 如何使用Bash Shell对目录中的文件实现递归式拷贝
      本篇内容介绍了“如何使用Bash Shell对目录中的文件实现递归式拷贝”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言 &nb...
      99+
      2023-06-09
    • Vue如何引用public中的js文件
      目录如何引用public中的js文件vue引用公共js步骤如何引用public中的js文件 在public文件夹下创建config.js文件。 config.js中可以使用变量,也可...
      99+
      2024-04-02
    • vue如何使用递归组件实现一个树形控件
      这篇文章主要介绍“vue如何使用递归组件实现一个树形控件”,在日常操作中,相信很多人在vue如何使用递归组件实现一个树形控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何使用递归组件实现一个树形控件...
      99+
      2023-07-04
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作