jsData 使用教程(八) 使用 TreeColumn 实现 TreeGrid

时间:2022-06-04 16:20:06

TreeGrid 是企业级开发中,最为常用的一个控件。在 JData 中,可以使用 TreeColumn 来实现。如下图所示:

jsData 使用教程(八) 使用 TreeColumn 实现 TreeGrid

但是在使用的时候,有一些要注意的地方。

第一:表的结构必须为最为常用的自连接方式来实现树形的。 如 Northwind 数据库的 Employee 表。

第二:数据量不能过大。使用 TreeColumn 需要一次性把所有数据加载到客户端。数据量过大则不适合使用。(万一数据量大呢?如何是好???)

 

 

jsData 使用教程(八) 使用 TreeColumn 实现 TreeGridjsData 使用教程(八) 使用 TreeColumn 实现 TreeGrid代码
Sys.onReady( function () {

var e = new WebApplication.EmployeeMetaType();
var treeDataSource = new JData.TreeDataSource( " ../Services/NorthwindService.asmx " , " GetEmployees " , ' InsertEmployee ' , ' UpdateEmployee ' , ' DeleteEmployee ' );
treeDataSource.set_selector([e.EmployeeID, e.ReportsTo, e.Country, String.format(
' {0} + " " + {1} as Name ' , e.FirstName, e.LastName)]);
treeDataSource.set_primaryKeyColumn(e.EmployeeID);
treeDataSource.set_parentColumn(e.ReportsTo);

var gridView = new JData.GridView(document.getElementById( ' gridView ' ));
var columns = new Array();
columns[columns.length]
= new JData.BoundField(e.EmployeeID, null , ' 80px ' , null , true );
columns[columns.length]
= new JData.TreeColumn( ' Name ' , null , ' 180px ' , ' 120px ' , true );
columns[columns.length]
= new JData.BoundField(e.Country, null , ' 120px ' , null , true );

var treeParentColumn = columns[columns.length] = new JData.TreeParentColumn( ' ReportsTo ' , ' ReportsTo ' , ' 120px ' , ' 114px ' );
treeParentColumn.set_dataSource(treeDataSource);
treeParentColumn.set_displayMember(
' Name ' );
treeParentColumn.set_valueMember(e.EmployeeID);

var commandColumn = columns[columns.length] = new JData.CommandField();
commandColumn.get_itemStyle().set_width(
' 80px ' );
commandColumn.set_showEditButton(
true );
commandColumn.set_showCancleButton(
true );
commandColumn.set_showDeleteButton(
true );

gridView.set_columns(columns);
gridView.set_dataSource(treeDataSource);
gridView.set_caption(
' Employees ' );
JData.JQueryUIStyle(gridView,
null , { autoUpdateStyle: false });
gridView.initialize();


$addHandler($get(
' btnInsertEmployee ' ), ' click ' , function () {
$(
' #dlgInsert ' ).dialog( ' open ' );
});

var dataSource = new JData.WebServiceDataSource( " ../Services/NorthwindService.asmx " , " GetEmployees " );
dataSource.set_selector([e.EmployeeID, e.FirstName, e.LastName, e.ReportsTo]);
dataSource.select(
null , function (items) {
for ( var i = 0 ; i < items.length; i ++ ) {
var option = document.createElement( ' option ' );
option.value
= items[i][e.EmployeeID];
option.text
= items[i][e.EmployeeID] + " " + items[i][e.FirstName];
$get(
' ddlReportsTo ' ).options.add(option);
}
});
$(
' #dlgInsert ' ).dialog({
modal:
true ,
autoOpen:
false ,
buttons: {
' OK ' : function () {
var employee = new WebApplication.Employee();
employee.FirstName
= $get( ' txtFirstName ' ).value;
employee.LastName
= $get( ' txtLastName ' ).value;
employee.ReportsTo
= $get( ' ddlReportsTo ' ).value == '' ? null : $get( ' ddlReportsTo ' ).value;
treeDataSource.insert(employee,
function () {
employee.Name
= employee.FirstName + " " + employee.LastName;
$(
' #dlgInsert ' ).dialog( ' close ' );
});
}
}
});
});

 

 

代码和创建 GridView 差不多,有两个值得注意的地方。

1、在这里创建 TreeDataSource 对象,而不是 WebDataSource 对象。在创建完后,必须设置主键,和相关连的外键。如下面这段代码所示。

 

jsData 使用教程(八) 使用 TreeColumn 实现 TreeGridjsData 使用教程(八) 使用 TreeColumn 实现 TreeGrid代码
var e = new WebApplication.EmployeeMetaType();
var treeDataSource = new JData.TreeDataSource( " ../Services/NorthwindService.asmx " , " GetEmployees " , ' InsertEmployee ' , ' UpdateEmployee ' , ' DeleteEmployee ' );
treeDataSource.set_selector([e.EmployeeID, e.ReportsTo, e.Country, String.format(
' {0} + " " + {1} as Name ' , e.FirstName, e.LastName)]);
treeDataSource.set_primaryKeyColumn(e.EmployeeID);
treeDataSource.set_parentColumn(e.ReportsTo);

 

 

2、就是插入数据了。在这里插入数据不能使用 ColumnField 的 New 按钮。必须另外创建一个输入框来输入数据,然后通过 TreeDataSource 将数据提交到服务端。TreeColumn 对象会监听到 TreeDataSource 的 Insert 事件,当 TreeDataSource 执行完 insert 方法后,便会把数据插入到相应的行。如下面代码所示:

 

jsData 使用教程(八) 使用 TreeColumn 实现 TreeGridjsData 使用教程(八) 使用 TreeColumn 实现 TreeGrid代码
$( ' #dlgInsert ' ).dialog({
modal:
true ,
autoOpen:
false ,
buttons: {
' OK ' : function () {
var employee = new WebApplication.Employee();
employee.FirstName
= $get( ' txtFirstName ' ).value;
employee.LastName
= $get( ' txtLastName ' ).value;
employee.ReportsTo
= $get( ' ddlReportsTo ' ).value == '' ? null : $get( ' ddlReportsTo ' ).value;
treeDataSource.insert(employee,
function () {
employee.Name
= employee.FirstName + " " + employee.LastName;
$(
' #dlgInsert ' ).dialog( ' close ' );
});
}
}
});

 

 

本文演示请看:http://www.jsdata.org/Demo/TreeGrid.html

全部演示及代码下载:http://www.jdata.org