html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="../../Scripts/bootstrap/js/bootstrap/css/bootstrap.css" rel="stylesheet" /> <link href="../../Scripts/bootstrap/js/bootstrap/css/bootstrap-theme.min.css" rel="stylesheet" /> <link href="../../Scripts/bootstrap/js/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" /> <link href="../../Scripts/bootstrap/js/jquery.treegrid.min.css" rel="stylesheet" /> <script src="../../Scripts/bootstrap/js/jQuery1.11.3.min.js"></script> <script src="../../Scripts/bootstrap/js/bootstrap/js/bootstrap.min.js"></script> <script src="../../Scripts/bootstrap/js/bootstrap-table/bootstrap-table.min.js"></script> <script src="../../Scripts/bootstrap/js/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script> <script src="../../Scripts/bootstrap/js/jquery.treegrid.js"></script> <script src="../../Scripts/bootstrap/js/bootstrap-table/jquery.treegrid.ajax.js"></script> <style> tr.checked-item { background-color: #d4e1f5 !important; } </style> </head> <body> <table id="table"></table> <script> $(function () { var name = parent.$("#FullBodyContent_MainName").val(); var $table = $("#table"); $table.myAjaxTreeTable({ url: 'treegrid.ashx?func=tree', ajaxParams: { name: name,type:"sbxj" }, rootidValue: "", striped: true, expandColumn: 0, columns: [ { field: 'name', title: '名稱', }, { field: 'step', title: '步驟' }, { field: 'required', title: '關(guān)鍵點' }, ], }); }) </script> </body> </html>
ashx:
using Ext.Net; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using XLT.QC.Domain; using XLT.QC.Entity; namespace XLT.QC.Web.Admin.RepairAdmin { /// <summary> /// treegrid 的摘要說明 /// </summary> public class treegrid : IHttpHandler { TestingMachineProcessDomain _testDomain = new TestingMachineProcessDomain(); public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string func = context.Request["func"]; switch (func) { case "tree": getTreeGridData(context); break; case "childtree": getChildNodeData(context); break; default: break; } } public void getTreeGridData(HttpContext context) { string type = context.Request["type"]; string name = context.Request["name"]; DataSet ds = _testDomain.getNodeData(name,type); List<MachineProcess> list = new List<MachineProcess>(); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { MachineProcess entity = new MachineProcess(); entity.name = ds.Tables[0].Rows[i]["Name"].ToString(); entity.id = ds.Tables[0].Rows[i]["Id"].ToString(); entity.pid = ds.Tables[0].Rows[i]["Pid"].ToString(); if (!string.IsNullOrWhiteSpace(ds.Tables[0].Rows[i]["Step"].ToString())) { entity.step = Convert.ToInt32(ds.Tables[0].Rows[i]["Step"]); } if (!string.IsNullOrWhiteSpace(ds.Tables[0].Rows[i]["Level"].ToString())) { entity.level = Convert.ToInt32(ds.Tables[0].Rows[i]["Level"]); } entity.required = ds.Tables[0].Rows[i]["Required"].ToString(); entity.isLeaf= true; list.Add(entity); } string jsonStr = JSON.Serialize(list); context.Response.Write(jsonStr); } public void getChildNodeData(HttpContext context) { string pid = context.Request["pid"]; string type = context.Request["type"]; string table = "TestingMachineProcess"; if (type=="sbxj") { table = "ArtificialProcess"; } string sql = "select Id,Pid,Name,Step,Level,QualityStandard,Required from " + table + " where Pid='" + pid + "' and (IsValid is null or IsValid=1) order by Step asc"; DataSet ds = ISS.DataAccess.DbHelper.ExecuteDataSetBySql(sql); List<MachineProcess> list = new List<MachineProcess>(); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { MachineProcess entity = new MachineProcess(); entity.name = ds.Tables[0].Rows[i]["Name"].ToString(); entity.id = ds.Tables[0].Rows[i]["Id"].ToString(); entity.pid = ds.Tables[0].Rows[i]["Pid"].ToString(); if (!string.IsNullOrWhiteSpace(ds.Tables[0].Rows[i]["Step"].ToString())) { entity.step = Convert.ToInt32(ds.Tables[0].Rows[i]["Step"]); } if (!string.IsNullOrWhiteSpace(ds.Tables[0].Rows[i]["Level"].ToString())) { entity.level = Convert.ToInt32(ds.Tables[0].Rows[i]["Level"]); } entity.required = ds.Tables[0].Rows[i]["Required"].ToString(); IDataReader dr = ISS.DataAccess.DbHelper.ExecuteReaderBySql("select COUNT(1) num from TestingMachineProcess where Pid='" + entity.id + "' "); if (dr.Read()) { if (Convert.ToInt32(dr["num"].ToString()) > 0) { entity.isLeaf = true; } else { entity.isLeaf = false; } } dr.Close(); dr.Dispose(); list.Add(entity); } string jsonStr = JSON.Serialize(list); context.Response.Write(jsonStr); } public class MachineProcess { public string id { get; set; } /// <summary> /// 父節(jié)點 /// </summary> public string pid { get; set; } /// <summary> /// 名稱 /// </summary> public string name { get; set; } /// <summary> /// 步驟 /// </summary> public int step { get; set; } /// <summary> /// 級別 /// </summary> public int level { get; set; } /// <summary> /// 質(zhì)量標(biāo)準(zhǔn)說明 /// </summary> //public string QualityStandard { get; set; } /// <summary> /// /// </summary> public bool isLeaf { get; set; } /// <summary> /// 關(guān)鍵點 /// </summary> public string required { get; set; } } public bool IsReusable { get { return false; } } } }
js:
(function ($) { "use strict"; $.fn.myAjaxTreeTable = function (options, param) { // 如果是調(diào)用方法 if (typeof options == 'string') { return $.fn.myAjaxTreeTable.methods[options](this, param); } // 如果是初始化組件 options = $.extend({}, $.fn.myAjaxTreeTable.defaults, options || {}); // 是否有radio或checkbox var hasSelectItem = false; var target = $(this); // 在外層包裝一下div,樣式用的bootstrap-table的 var _main_div = $("<div class='fixed-table-container'></div>"); target.before(_main_div); _main_div.append(target); target.addClass("table table-hover treegrid-table table-bordered"); if (options.striped) { target.addClass('table-striped'); } // 工具條在外層包裝一下div,樣式用的bootstrap-table的 if (options.toolbar) { var _tool_div = $("<div class='fixed-table-toolbar' style='display:none;'></div>"); var _tool_left_div = $("<div class='bs-bars pull-left'></div>"); _tool_left_div.append($(options.toolbar)); _tool_div.append(_tool_left_div); _main_div.before(_tool_div); } // 得到根節(jié)點 target.getRootNodes = function (data) { // 指定Root節(jié)點值 var _root = options.rootidValue ? options.rootidValue : ""; var result = []; $.each(data, function (index, item) { // 這里兼容幾種常見Root節(jié)點寫法 // 默認的幾種判斷 var _defaultRootFlag = item[options.pid] == '0' || item[options.pid] == 0 || item[options.pid] == null || item[options.pid] == ''; if (!item[options.pid] || (_root ? (item[options.pid] == options.rootidValue) : _defaultRootFlag)) { result.push(item); } // 添加一個默認屬性,用來判斷當(dāng)前節(jié)點有沒有被顯示 item.isShow = false; }); return result; }; var j = 0; // 遞歸獲取子節(jié)點并且設(shè)置子節(jié)點 target.getChildNodes = function (data, parentNode, parentIndex, tbody) { $.each(data, function (i, item) { if (item[options.pid] == parentNode[options.id]) { var tr = $('<tr></tr>'); var nowParentIndex = (parentIndex + (j++) + 1); tr.addClass('treegrid-' + nowParentIndex); tr.addClass('treegrid-parent-' + parentIndex); tr.addClass('unknow'); tr.attr("isLeaf", item.isLeaf); tr.attr("level", item.level); target.renderRow(tr, item); item.isShow = true; tbody.append(tr); target.getChildNodes(data, item, nowParentIndex, tbody) } }); }; target.renderChildRows = function (data, parentNode, parentIndex, tbody) { var html = ""; var parentNum = $(tbody).attr('class').split(" ")[2]; $.each(data, function (i, item) { var tr = $('<tr></tr>'); var nowParentIndex = parentIndex; tr.addClass('treegrid-' + nowParentIndex + i); tr.addClass('treegrid-parent-' + parentIndex); tr.addClass('unknow'); tr.attr("isLeaf", item.isLeaf); tr.attr("level", item.level); target.renderRow(tr, item); item.isShow = true; html += tr.get(0).outerHTML; }); tbody.after(html); }; // 行添加內(nèi)容 target.renderRow = function (tr, item) { $.each(options.columns, function (index, column) { // 判斷有沒有選擇列 if (index == 0 && column.field == 'selectItem') { hasSelectItem = true; var td = $('<td style="text-align:center;width:36px"></td>'); if (column.radio) { var _ipt = $('<input name="select_item" type="radio" value="' + item[options.id] + '"></input>'); td.append(_ipt); } if (column.checkbox) { var _ipt = $('<input name="select_item" type="checkbox" value="' + item[options.id] + '"></input>'); td.append(_ipt); } tr.append(td); } else { var html = "<td mainid='" + item[options.id] + "' style='text-align:left;'>"; var level = parseInt(item.level); if (index == 0) { if (item.pid != "") { for (var i = 0; i < level; i++) { html += "<span class='treegrid-indent'></span>"; } } html += "<span class='treegrid-expander'></span>" + item[column.field] + "</td>"; } else { html += item[column.field] + "</td>"; } // 增加formatter渲染 if (column.formatter) { td.html(column.formatter.call(this, item, index)); } tr.append($(html)); } }); } // 加載數(shù)據(jù) target.load = function (parms) { // 加載數(shù)據(jù)前先清空 target.html(""); // 構(gòu)造表頭 var thr = $('<tr></tr>'); $.each(options.columns, function (i, item) { var th = null; // 判斷有沒有選擇列 if (i == 0 && item.field == 'selectItem') { hasSelectItem = true; th = $('<th style="text-align:' + item.valign + ';width:36px"></th>'); } else { th = $('<th style="text-align:' + item.valign + ';padding:10px;' + ((item.width) ? ('width:' + item.width) : '') + '"></th>'); } th.text(item.title); thr.append(th); }); var thead = $('<thead class="treegrid-thead"></thead>'); thead.append(thr); target.append(thead); // 構(gòu)造表體 var tbody = $('<tbody class="treegrid-tbody"></tbody>'); target.append(tbody); // 添加加載loading var _loading = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">正在努力地加載數(shù)據(jù)中,請稍候……</div></td></tr>' tbody.html(_loading); // 默認高度 if (options.height) { tbody.css("height", options.height); } $.ajax({ type: options.type, url: options.url, data: parms ? parms : options.ajaxParams, dataType: "JSON", success: function (data, textStatus, jqXHR) { // 加載完數(shù)據(jù)先清空 tbody.html(""); if (!data || data.length <= 0) { var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">沒有記錄</div></td></tr>' tbody.html(_empty); return; } var rootNode = target.getRootNodes(data); //console.log(rootNode); $.each(rootNode, function (i, item) { var tr = $('<tr></tr>'); tr.addClass('treegrid-' + (j + "_" + i)); tr.attr('load', 'true'); tr.attr('level', item.level); tr.addClass('unknow'); tr.addClass('tree_rootnode'); target.renderRow(tr, item); item.isShow = true; tbody.append(tr); target.getChildNodes(data, item, (j + "_" + i), tbody); }); target.append(tbody); // 初始化treegrid bug //target.treegrid({ // treeColumn: options.expandColumn ? options.expandColumn : (hasSelectItem ? 1 : 0),//如果有radio或checkbox默認第二列層級顯示,當(dāng)前是在用戶未設(shè)置的提前下 // expanderExpandedClass: options.expanderExpandedClass, // expanderCollapsedClass: options.expanderCollapsedClass //}); //if (!options.expandAll) { // target.treegrid('collapseAll'); //} $(".treegrid-tbody").find("tr:not(.tree_rootnode)").hide(); target.repainExpends(); }, error: function (xhr, textStatus) { var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>' tbody.html(_errorMsg); } }); } /*** 初始化圖標(biāo) ***/ target.repainExpends = function (tr, reset) { var trExpends; if (tr) { var str = tr.attr('class').split(" ")[0].split("-")[1]; var cls = "treegrid-parent-" + str; trExpends = target.find("tr." + cls); } else { trExpends = target.find("tr"); } /* * isleaf 是否有子數(shù)據(jù) * load 是否已加載子數(shù)據(jù) */ if (reset == "true") { $.each(trExpends, function (index, item) { if ($(item).attr('isLeaf') == 'true') { $(item).find("span:last-child").removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-right').addClass('glyphicon'); } }); } else { $.each(trExpends, function (index, item) { if ($(item).attr('isLeaf') == 'true' && $(item).attr('load') != 'true') { $(item).find("span:last-child").removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-right').addClass('glyphicon'); //收縮 } else if ($(item).attr('isLeaf') == 'true' && $(item).attr('load') == 'true') { $(item).find("span:last-child").addClass('glyphicon-chevron-down').removeClass('glyphicon-chevron-right').addClass('glyphicon'); //展開 } else { if ($(item).hasClass('tree_rootnode')) { $(item).find("span:last-child").removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-right').addClass('glyphicon'); //收縮 } else { $(item).find("span:last-child").removeClass('glyphicon-chevron-down').removeClass('glyphicon-chevron-right'); //刪除圖標(biāo) } } }); } } /****** 加載子節(jié)點數(shù)據(jù) start ***************/ target.loadChilds = function (parentTR, parms) { debugger; var tbody = $(parentTR).parents(".treegrid-tbody"); parms = $.extend({}, parms, options.ajaxParams); $.ajax({ type: options.type, url: "handler/DeviceMaintainService.ashx?function=childtree", data: parms, dataType: "JSON", success: function (data, textStatus, jqXHR) { var _tr = target.find(".treegrid-" + parms.parentIndex); _tr.attr('load', 'true'); target.renderChildRows(data, { "mainId": parms.pid }, parms.parentIndex, _tr); parentTR.removeClass('unknow').addClass('know'); target.repainExpends(parentTR); }, error: function (xhr, textStatus) { var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>' tbody.html(_errorMsg); }, }); } /****** 加載子節(jié)點數(shù)據(jù) end ***************/ /*自定義擴展方法*/ var customMethod = { collapseNode: function (parentTr) { var parentNum = parentTr.attr('class').split(" ")[0].split("-")[1]; var childCls = "treegrid-parent-" + parentNum; var child = $("tr." + childCls); if (child.length > 0) { child.hide(); for (var i = 0; i < child.length; i++) { if (child.eq(i).attr("isleaf") == "true") { child.eq(i).find("span.treegrid-expander").removeClass("glyphicon-chevron-down").addClass("glyphicon-chevron-right"); } this.collapseNode(child.eq(i)); } } }, expandNode: function (parentTr) { var parentNum = parentTr.attr('class').split(" ")[0].split("-")[1]; var childCls = "treegrid-parent-" + parentNum; var child = $("tr." + childCls); if (child.length > 0) { child.show(); for (var i = 0; i < child.length; i++) { if (child.eq(i).attr("isleaf") == "true") { child.eq(i).find("span.treegrid-expander").removeClass("glyphicon-chevron-right").addClass("glyphicon-chevron-down"); } //this.expandNode(child.eq(i)); } } } } /*初始加載樹數(shù)據(jù)*/ if (options.url) { target.load(); } else { // 通過data屬性傳遞一個數(shù)據(jù)集合對組件進行初始化, } /*圖標(biāo)事件綁定*/ $(document).on('click', 'span.glyphicon-chevron-right', function (e) { //console.log("right"); if ($(this).parent().parent().attr('load') != 'true') { //console.log("loadchildren函數(shù)下節(jié)點圖標(biāo)綁定的事件觸發(fā)了"); $(this).removeClass("glyphicon-chevron-right").addClass("glyphicon-chevron-down"); $(this).parent().parent().addClass("expand").removeClass("collaps"); target.loadChilds( $(this).parent().parent(), { "pid": $(this).parent().attr('mainid'), "parentIndex": $(this).parent().parent().attr('class').split(" ")[0].split("-")[1], "nowParentIndex": $(this).parent().parent().attr('class').split(" ")[0].split("-")[0] }); } else { var parentTr = $(this).parent().parent(); //var level = parentTr.attr("level"); //var parentNum = parentTr.attr('class').split(" ")[0].split("-")[1]; //var childCls = "treegrid-parent-" + parentNum; //var child = $("tr." + childCls); //if (level == "0" || $(this).parent().parent().hasClass("tree_rootnode")) { //根節(jié)點 // $(".treegrid-tbody").find("tr:not(.tree_rootnode)").show(); //} //else { // child.show(); //} customMethod.expandNode(parentTr); $(this).removeClass("glyphicon-chevron-right").addClass("glyphicon-chevron-down"); $(this).parent().parent().addClass("expand").removeClass("collaps"); //直屬子級圖標(biāo)初始化統(tǒng)一為right target.repainExpends(parentTr, "true"); } e.stopPropagation(); }); $(document).on('click', 'span.glyphicon-chevron-down', function (e) { //console.log("down"); if ($(this).parent().parent().hasClass("expand")) { //獲取選中行 var parentTr = $(this).parent().parent(); //var level = parentTr.attr("level"); //if (level == "0" || $(this).parent().parent().hasClass("tree_rootnode")) { // $(".treegrid-tbody").find("tr:not(.tree_rootnode)").hide(); //} //else { customMethod.collapseNode(parentTr); //} console.log(parentTr); } else { } $(this).removeClass("glyphicon-chevron-down").addClass("glyphicon-chevron-right"); $(this).parent().parent().addClass("collaps").removeClass("expand"); e.stopPropagation(); }); $(document).on('click', '.treegrid-tbody tr', function () { $(".treegrid-tbody tr").removeClass("checked-item"); var id = $(this).children(0).attr("mainid"); $(this).addClass("checked-item"); parent.$("#FullBodyContent_hdSelectedNodeId").val(id); $("#treeId").val(id); }) return target; }; // 組件方法封裝 $.fn.myAjaxTreeTable.methods = { // 返回選中記錄的id getSelections: function (target) { var _ipt = target.find("tbody").find("tr").find("input[name='select_item']:checked"); var chk_value = []; if (_ipt.attr("type") == "radio") { chk_value.push({ id: _ipt.val() }); } else { _ipt.each(function (_i, _item) { chk_value.push({ id: $(_item).val() }); }); } return chk_value; }, // 刷新記錄 refresh: function (target, parms) { if (parms) { target.load(parms); } else { target.load(); } }, // 重置表格視圖 resetHeight: function (target, height) { target.find("tbody").css("height", height + 'px'); } }; $.fn.myAjaxTreeTable.defaults = { id: 'id',// 選取記錄返回的值 pid: 'pid',// 用于設(shè)置父子關(guān)系 rootidValue: null,//設(shè)置根節(jié)點id值----可指定根節(jié)點,默認為null,"",0,"0" data: [], // 構(gòu)造table的數(shù)據(jù)集合,本地測試可以設(shè)置具體數(shù)據(jù) type: "GET", // 請求數(shù)據(jù)的ajax類型 url: null, // 請求數(shù)據(jù)的ajax的url ajaxParams: {}, // 請求數(shù)據(jù)的ajax的data屬性 expandColumn: null,// 在哪一列上面顯示展開按鈕 expandAll: false, // 是否全部展開 striped: false, // 是否各行漸變色 columns: [], toolbar: null,//頂部工具條 height: 0, expanderExpandedClass: 'glyphicon glyphicon-chevron-down',// 展開的按鈕的圖標(biāo) expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'// 縮起的按鈕的圖標(biāo) }; })(jQuery);
效果圖:

浙公網(wǎng)安備 33010602011771號