treegrid控件应用(拖拽)


一、数据

看到这样的前端控件,我最先关心的是数据是如何存储的。这里以json为例,贴一个来自官网的样例json文件:

第一类:

[{
	"id":1,
	"name":"C",
	"size":"",
	"date":"02/19/2010",
	"type":"folder",
	"children":[{
		"id":2,
		"name":"Program Files",
		"size":"120 MB",
		"date":"03/20/2010",
		"type":"folder",
		"children":[{
			"id":21,
			"name":"Java",
			"size":"",
			"date":"01/13/2010",
			"state":"closed",
			"type":"folder",
			"children":[{
				"id":211,
				"name":"java.exe",
				"size":"142 KB",
				"date":"01/13/2010",
				"type":"pack"
			},{
				"id":212,
				"name":"jawt.dll",
				"size":"5 KB",
				"date":"01/13/2010",
				"type":"pack"
			}]
		},{
			"id":22,
			"name":"MySQL",
			"size":"",
			"date":"01/13/2010",
			"state":"closed",
			"type":"folder",
			"children":[{
				"id":221,
				"name":"my.ini",
				"size":"10 KB",
				"date":"02/26/2009",
				"type":"pack"
			},{
				"id":222,
				"name":"my-huge.ini",
				"size":"5 KB",
				"date":"02/26/2009",
				"type":"pack"
			},{
				"id":223,
				"name":"my-large.ini",
				"size":"5 KB",
				"date":"02/26/2009",
				"type":"pack"
			}]
		}]
	},{
		"id":3,
		"name":"eclipse",
		"size":"",
		"date":"01/20/2010",
		"type":"folder",
		"children":[{
			"id":31,
			"name":"eclipse.exe",
			"size":"56 KB",
			"date":"05/19/2009",
			"type":"pack"
		},{
			"id":32,
			"name":"eclipse.ini",
			"size":"1 KB",
			"date":"04/20/2010",
			"type":"pack"
		},{
			"id":33,
			"name":"notice.html",
			"size":"7 KB",
			"date":"03/17/2005",
			"type":"pack"
		}]
	}]
}]

2..{"total":7,"rows":[
    {"id":1,"name":"All Tasks","begin":"3/4/2010","end":"3/20/2010","progress":60,"iconCls":"icon-ok"},
    {"id":2,"name":"Designing","begin":"3/4/2010","end":"3/10/2010","progress":100,"_parentId":1,"state":"closed"},
    {"id":21,"name":"Database","persons":2,"begin":"3/4/2010","end":"3/6/2010","progress":100,"_parentId":2},
    {"id":22,"name":"UML","persons":1,"begin":"3/7/2010","end":"3/8/2010","progress":100,"_parentId":2},
    {"id":23,"name":"Export Document","persons":1,"begin":"3/9/2010","end":"3/10/2010","progress":100,"_parentId":2},
    {"id":3,"name":"Coding","persons":2,"begin":"3/11/2010","end":"3/18/2010","progress":80},
    {"id":4,"name":"Testing","persons":1,"begin":"3/19/2010","end":"3/20/2010","progress":20}
],"footer":[
    {"name":"Total Persons:","persons":7,"iconCls":"icon-sum"}
]}
可以根据_parentId来确定它的父节点。

二、使用

调用treegrid有两种方式,第一种直接使用HTML配置,第二种用JS配置。

官网上贴的

<table id="tt" class="easyui-treegrid" style="width:600px;height:400px"
        data-options="url:'get_data.php',idField:'id',treeField:'name'">
    <thead>
        <tr>
            <th data-options="field:'name',width:180">Task Name</th>
            <th data-options="field:'persons',width:60,align:'right'">Persons</th>
            <th data-options="field:'begin',width:80">Begin Date</th>
            <th data-options="field:'end',width:80">End Date</th>
        </tr>
    </thead>
</table>

第二种:

HTML中:

<table id="tt" style="width:600px;height:400px"></table>
JS中:

$('#tt').treegrid({
    url:'get_data.php',
    idField:'id',
    treeField:'name',
    columns:[[
        {title:'Task Name',field:'name',width:180},
        {field:'persons',title:'Persons',width:60,align:'right'},
        {field:'begin',title:'Begin Date',width:80},
        {field:'end',title:'End Date',width:80}
    ]]
});

注意: 我在使用的时候发现了一些问题,情况可能比较特殊。最好使用最新的easyui文件,我用旧版本的文件,结果不认table标签中的data-option属性。对于使用第一种配置方法的童鞋,如果没有加载进入数据的话,可尝试手动加载:

$.post('treegrid.json',function(data){
                $('#test2').treegrid('loadData',data);
                },'json');
treegrid.json是你的json数据文件,相对地址。


三、拓展

treegrid支持很多功能可以自己定义,官网上有官网DEMO
下边记录一下我在使用拖拽功能时候遇到的问题:

treegrid支持拖拽的官方DEMO

让treegrid支持拖拽还需要treegrid-dnd.js  。这个文件中定义了拖拽相关的接口函数,文件不大,读起来应该问题不大。

1. 禁止drop

在我的需求中,叶子节点是不可以拖到叶子节点上的,demo中,如果把叶子节点放在叶子节点上的话,目标节点就会自动变为被拖动节点的父节点,与我的需求不符合。修改treegrid-dnd.js中的onDrop函数,在onDrop的时候判断是否叶子节点,是的话就返回:

var dest = this;
						var action, point;
						var tr = opts.finder.getTr(target, $(this).attr('node-id'));
						var dRow = getRow(this);
						var sRow = getRow(source);
						//alert("destination:"+dRow.type+",source:"+sRow.type)
						if(dRow.type=="pack")
						{
							tr.removeClass('treegrid-row-append treegrid-row-top treegrid-row-bottom');
							return;
						}

上边代码中,dRow.type是自定义的,type是我的json数据中的一个属性,来标识是否是叶子节点。

2. 节点处于编辑状态下禁止拖拽

需求中有要求可以修改节点的名字,编辑列中editor="text",进入编辑状态后变为textbox,如果想使用鼠标选中内容的话就会触发拖动事件,因此在编辑的时候要禁止拖拽。

但是treegrid-dnd.js 中没有禁止拖拽的接口,只有enableDnd。查了好多没有查到禁止的用法,而且官网上提供的方法也只有enableDnd。那么就参考enableDnd的写法,自已写一个disableDnd好了:

$.extend($.fn.treegrid.methods, {
		disableDnd:function(jq,id){
			return jq.each(function() {
				var target = this;
				var state = $.data(this, 'treegrid');
				state.disabledNodes = [];
				var t = $(this);
				var opts = state.options;
				if (id) {
					var nodes = opts.finder.getTr(target, id);
					var rows = t.treegrid('getChildren', id);
					for (var i = 0; i < rows.length; i++) {
						nodes = nodes.add(opts.finder.getTr(target, rows[i][opts.idField]));
					}
				} else {
					var nodes = t.treegrid('getPanel').find('tr[node-id]');
				}
				nodes.draggable({
					disabled: true,
					revert: true,
					cursor: 'pointer'});
			});
		}
	});
我在调用拖拽的时候是配置的table的data-option,这里也要修改:

<table id="dndtree" title="Folder Browser" class="easyui-treegrid" style="width:700px;height:250px"
			data-options="
				url:'treegrid.json',
				rownumbers: false,
				idField: 'id',
				treeField: 'name',
				onContextMenu:onContextMenu,
				onLoadSuccess: function(row){
					$(this).treegrid('enableDnd', row?row.id:null);
				},
                onBeforeEdit: function(row){
                    $(this).treegrid('disableDnd');
                },
                onAfterEdit: function(row){
                    $(this).treegrid('enableDnd');
                },
                onCancelEdit: function(row){
                    $(this).treegrid('enableDnd');
                }
			">
		<thead>
			<tr>
				<th data-options="field:'name',formatter:formatName" width="220" editor="text">Name</th>
				<th data-options="field:'size'" width="150" align="right">Size</th>
				<th data-options="field:'date'" width="200">Modified Date</th>
			</tr>
		</thead>
	</table>
onBeforeEdit时禁止拖拽,结束编辑或者取消编辑的时候再启用拖拽。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF TreeGrid是一种基于WPF(Windows Presentation Foundation)技术的树形表格控件。WPF是Microsoft开发的一种图形用户界面框架,可用于创建富客户端应用程序。 TreeGrid控件像传统的表格控件一样,可以用来展示数据,并且具有树形结构的功能。它可以同时显示行和列,而且支持多级父子关系,使得数据可以以树形的方式展示和管理。这对于需要展示层级关系的数据非常有用,例如组织结构图、目录结构等。 WPF TreeGrid提供了许多功能,使得它非常灵活和强大。它支持多列排序、单元格编辑、拖拽、展开和折叠等功能。它还可以自定义每个单元格的样式和模板,使得用户可以根据自己的需求调整控件的外观和行为。 使用WPF TreeGrid可以方便地处理大量和复杂的数据,并提供了直观和交互性强的界面。它还可以进行数据绑定,与其他WPF控件配合使用,实现更加复杂的功能。 总之,WPF TreeGrid是一种强大而灵活的控件,适用于需要展示和管理树形数据的应用程序。无论是用于企业管理系统还是教育科研平台,它都能够提供理想的解决方案。 ### 回答2: WPF TreeGrid 是一种基于 WPF 技术开发的树形表格控件。它可以以树形结构展示数据,并支持多级分组和排序功能。WPF TreeGrid 提供了丰富的视觉效果和交互功能,使得用户能够直观地操作和查看数据。 WPF TreeGrid 可以在树状结构中显示数据,每个节点都可以包含子节点。通过展开或折叠节点,用户可以方便地查看和管理数据。同时,WPF TreeGrid 还支持多级分组的功能。用户可以通过拖拽列头将数据进行分组,并且分组的方式可以进行自定义,提高了数据的展示和管理效率。 WPF TreeGrid 还支持数据的排序功能。用户可以点击列头来对数据进行升序或降序排序,从而更方便地进行数据分析和查找。同时,WPF TreeGrid 还支持行编辑、列宽调整、单元格合并、拖拽等常见的数据操作和交互功能。 另外,WPF TreeGrid 还提供了丰富的样式和模板,使得用户可以根据自己的需求进行个性化的界面设计,并且支持自定义列和自定义单元格的渲染方式,以满足不同的业务需求。 总而言之,WPF TreeGrid 是一个功能强大、灵活易用的树形表格控件。它能够以树状结构展示数据,支持多级分组和排序功能,并提供了丰富的样式和交互功能,帮助用户更方便地查看和管理数据。无论是在商业应用中还是在数据分析中,WPF TreeGrid 都是一个值得选择的控件。 ### 回答3: WPF TreeGrid是一种用于Windows Presentation Foundation(WPF)应用程序的控件,它结合了树形结构和表格的特点,能够在一个控件中同时展示树形数据和表格数据。 WPF TreeGrid内部结构类似于树形结构,每个数据项都可以包含子项,从而形成树状的层次结构。同时,每个数据项也可以包含多个属性或字段,这些属性或字段可以在表格中的不同列中表示和展示。 与传统的树形控件不同,WPF TreeGrid可以支持各列的排序、过滤和分组等功能。用户可以根据列中的数据对数据项进行排序,也可以根据需要设置列的过滤条件,只显示满足条件的数据项。此外,WPF TreeGrid还支持将数据项按照某个列进行分组,以将相同属性或字段值的数据项放在一起显示。 WPF TreeGrid还提供了一些常见的交互功能,例如展开和折叠节点、选择节点、编辑单元格等。用户可以通过点击节点前的加号或减号按钮来展开或折叠节点,也可以通过鼠标点击来选择某个节点。当用户需要编辑某个单元格时,可以通过双击单元格或按下F2键来进入编辑模式,完成数据的修改。 总体而言,WPF TreeGrid是一种功能强大、灵活性高的控件,能够满足复杂数据展示和交互需求。通过它,用户可以轻松地展示和管理具有层次结构的表格数据,提高应用程序的用户体验和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值