广告位联系
返回顶部
分享到

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

C#教程 来源:互联网 作者:佚名 发布时间:2023-12-26 22:07:54 人浏览
摘要

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

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

截图如下:

sys_tbl

其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如: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类型

1

2

3

4

/// <summary>

        /// define the gloable parameter to save the rel obj data

        /// </summary>

        public static Dictionary<string, string> <strong>deepRef </strong>= new Dictionary<string, string>();

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

/// <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();

            }

 

        }

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

/// <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文件引用路径

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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");

                }

            }

最终结果 如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<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>

完事代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

/// <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;

        }


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C#实现窗体换肤的教程方法

    C#实现窗体换肤的教程方法
    实践过程 效果 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5
  • C#递归应用之实现JS文件的自动引用介绍

    C#递归应用之实现JS文件的自动引用介绍
    两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张
  • C#纯技术之Class写入Json介绍

    C#纯技术之Class写入Json介绍
    C# Class写入Json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /// summary /// 写入json文件 /// /summary /// param name=obj/param /// param name=save
  • C#实体类转换的两种方式总结
    C#实体类转换方式 将一个实体类的数据赋值到另一个实体类中(亦或者实现深拷贝)。 以下提供两种方式 一种是序列化 一种是泛型+反射
  • C#中的时间显示格式(12小时制VS24小时制)介绍
    C#时间显示格式 一起看下: 24小时制 1 this.toolStripStatusLabel1.Text = 您好,欢迎来到XXXX控制系统! + 当前时间: + DateTime.Now.ToString(yyyy-MM-dd HH
  • C#中使用Spire.doc对word的操作方式介绍

    C#中使用Spire.doc对word的操作方式介绍
    使用Spire.doc对word的操作 在最近的工程中我们要处理一些word文档。通过在网上的大量搜索,我发现大多数软件功能不是不完整就是有重复。
  • C#纯技术之Class写入Json介绍

    C#纯技术之Class写入Json介绍
    C# Class写入Json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /// summary /// 写入json文件 /// /summary /// param name=obj/param /// param name=save
  • C#实体类转换的两种方式介绍
    C#实体类转换方式 将一个实体类的数据赋值到另一个实体类中(亦或者实现深拷贝)。 以下提供两种方式 一种是序列化 一种是泛型+反射
  • 在C#中构造自定义属性的详细介绍
    属性用于向程序添加元数据,例如编译器指令和其他信息,例如注释、描述、方法和类。 .Net Framework 允许创建可用于存储声明性信息并可在
  • 在C#中获取路径内的所有目录和子目录的教程
    要获取目录,C#提供了一个方法Directory.GetDirectories。Directory.GetDirectories方法返回与指定搜索模式在指定目录中匹配的子目录的名称(包括其路
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计