溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用

發(fā)布時(shí)間:2023-03-11 15:39:41 來源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用文章都會(huì)有所收獲,下面我們一起來看看吧。

    背景

    兩張表,分別是 :sys_tbl,和 sys_field,其中:sys_tbl 是系統(tǒng)所有表的信息,包含兩個(gè)字段 :code(表名),name(表描述信息);sys_fld 是記錄第張表中的字段 的名稱(field)和描述信息(table) , 

    截圖如下:

    sys_tbl

    C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用

    C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用

    其中,字段 名稱包含對(duì)其它名稱(對(duì)象) 的引用,寫法為:表名(去除下劃線)_引用字段 ,如:einventory_cinvcode,就是對(duì)表 e_inventory 中字段 cinvcode的引用。

    每張表都在系統(tǒng) 中對(duì)應(yīng)有不同功能的js文件(模塊)如: 編輯窗體(dialog類型),跨域選擇窗體(field)類型等

    需求

    在一個(gè)綜合的頁面中,會(huì)對(duì)其它對(duì)象進(jìn)行引用(依賴),而這種引用最終體現(xiàn)在對(duì)js文件的包含。同時(shí)被引用的js 文件(一級(jí)引用)還有自已關(guān)聯(lián)對(duì)象(二級(jí)引用).....如此下去,直到N 級(jí)引用。

    所以現(xiàn)在需要逐層找到對(duì)象的引用,直到最后不依賴任何對(duì)象為止,并把這些js文件生成引用包含路徑(不重復(fù))

    分析

    1、返回結(jié)果類型

    得到這些js引用,不能重復(fù),但是對(duì)象之間引用是可以存在交叉的,在整個(gè)引用鏈條上,同一個(gè)對(duì)象會(huì)被 多個(gè)對(duì)象引用,所以簡單的字符串?dāng)?shù)組是避免不了重復(fù)的。但是在C#中的HashSet可以做到不重復(fù),同時(shí)這個(gè)去重工作是自動(dòng)完成的,所以存結(jié)果如果是簡單的value類型,用 HashSet就可以,但是因?yàn)樽侄沃斜淼男畔⒁呀?jīng)被格式化過,所以還要把格式化之前的表名稱取出與字段對(duì)應(yīng),所以需要一個(gè)key-value類型的數(shù)據(jù) ,那就是 Dictionary<string, string> 了。

    2、算法選擇

    因?yàn)椴檎乙?,是層層進(jìn)行的,而且下一層引用的要用到上一層的引用結(jié)果,所以這里選擇遞歸算法

    代碼實(shí)現(xiàn)

    聲明一個(gè)全局變量,記錄所有的表與字段的對(duì)應(yīng)的數(shù)據(jù),因?yàn)樾枰_保數(shù)據(jù)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>();

    入口函數(shù),完成準(zhǔn)備工作,(數(shù)據(jù)庫連接,參數(shù)準(zhǔn)備)

    /// <summary>
            /// 通過表的字段 獲取相關(guān)的引用字段依賴的對(duì)象 直到?jīng)]有依賴為止
            /// </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();
                }
    
            }

    遞歸函數(shù),最終完成在數(shù)據(jù)庫中獲取字段依賴的對(duì)象的獲取

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

    對(duì)函數(shù)進(jìn)行調(diào)用,并組織出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");
                    }
                }

    最終結(jié)果 如下:

    <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>
            /// 通過表的字段 獲取相關(guān)的引用字段依賴的對(duì)象 直到?jīng)]有依賴為止
            /// </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;
            }

    關(guān)于“C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C#遞歸應(yīng)用之如何實(shí)現(xiàn)JS文件的自動(dòng)引用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    js
    AI