`
newlethe
  • 浏览: 83819 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Ext中从grid 到tree的拖拽

    博客分类:
  • Ext
阅读更多
// 使用一个Json数据结构作为tree的本地数据源     
var nodes = [     
    {'text' : 'SY0706', 'id' : 1, 'leaf' : false, 'cls' : 'folder', 'children' : [     
        {'text' : '1', 'id' : 11, 'leaf' : false, 'cls' : 'folder', 'children' : [   
            {'text' : '01', 'id' : 111, 'leaf' : true, 'cls' : 'file'},   
            {'text' : '02', 'id' : 112, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '03', 'id' : 113, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '04', 'id' : 114, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '05', 'id' : 115, 'leaf' : true, 'cls' : 'file'}     
        ]},    
        {'text' : '2', 'id' : 12, 'leaf' : false, 'cls' : 'folder', 'children' : [    
            {'text' : '06', 'id' : 121, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '07', 'id' : 122, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '08', 'id' : 123, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '09', 'id' : 124, 'leaf' : true, 'cls' : 'file'},     
            {'text' : '10', 'id' : 125, 'leaf' : true, 'cls' : 'file'}     
        ]}   
    ]}    
];    
  
// 拖拽时需要用到的函数,用来处理添加树结点   
/*  
 * TreeNode     node        :   tree上的目标结点  
 * TreeNode     refNode     :   目标结点的子结点,用于定位新添加的结点  
 * Record Array selections  :   从grid中选取的记录数组     
 */  
var ddFunction = function(node, refNode, selections) {   
    for(var i = 0; i < selections.length; i ++) {   
        var record = selections[i];   
        node.insertBefore(new Tree.TreeNode({   
            text: record.get('text'),   
            id: record.get('id'),   
            leaf: record.get('leaf'),   
            cls: record.get('cls')   
        }), refNode);   
    }   
}   
  
// 建一棵树,并将其设置到tgDD拖动组中   
var Tree = Ext.tree;     
  
var tree = new Tree.TreePanel({   
    renderTo: 'tree',   
    animate: true,     
    loader: new Tree.TreeLoader(),   
    lines: true,     
    selModel: new Ext.tree.MultiSelectionModel(),     
    containerScroll: false,   
    autoHeight: true,   
    root: new Tree.AsyncTreeNode({     
        text: 'BUAA',     
        draggable: false,     
        id: 0,     
        children: nodes,   
        expanded: true  
    }),   
    enableDD: true,   
    ddGroup: "tgDD",   
    listeners: {   
        // 监听beforenodedrop事件,主要就是在这里工作   
        // 参考“http://www.iteye.com/topic/155272”中的讨论   
        beforenodedrop: function(dropEvent) {   
            var node = dropEvent.target;    // 目标结点   
            var data = dropEvent.data;      // 拖拽的数据   
            var point = dropEvent.point;    // 拖拽到目标结点的位置   
            // 如果data.node为空,则不是tree本身的拖拽,而是从grid到tree的拖拽,需要处理   
            if(!data.node) {   
                switch(point) {   
                    case 'append':   
                        // 添加时,目标结点为node,子结点设为空   
                        ddFunction(node, null, data.selections);   
                        break;   
                    case 'above':   
                        // 插入到node之上,目标结点为node的parentNode,子结点为node   
                        ddFunction(node.parentNode, node, data.selections);   
                        break;   
                    case 'below':   
                        // 插入到node之下,目标结点为node的parentNode,子结点为node的nextSibling   
                        ddFunction(node.parentNode, node.nextSibling, data.selections);   
                        break;   
                }   
            }   
        }   
    }   
});   
  
// grid的数据源   
var data = [     
    ['11', 211, true, 'file'],   
    ['12', 212, true, 'file'],   
    ['13', 213, true, 'file'],   
    ['14', 214, true, 'file'],   
    ['15', 215, true, 'file'],   
    ['16', 221, true, 'file'],   
    ['17', 222, true, 'file'],   
    ['18', 223, true, 'file'],   
    ['19', 224, true, 'file'],   
    ['20', 225, true, 'file']   
];   
var store = new Ext.data.Store({   
    reader: new Ext.data.ArrayReader({}, [   
       {name: 'text'},   
       {name: 'id'},   
       {name: 'leaf'},   
       {name: 'cls'}   
    ])   
});   
store.loadData(data);   
// 建一个grid,并设置到tgDD拖拽组中   
var Grid = Ext.grid;   
  
var model = new Grid.ColumnModel([   
    {header: "text", width: 50, sortable: true, dataIndex: 'text'},   
    {id:'id', header: "id", width: 50, sortable: true, dataIndex: 'id'},   
    {header: "leaf", width: 50, sortable: true, dataIndex: 'leaf'},   
    {header: "cls", width: 50, sortable: true, dataIndex: 'cls'}   
]);   
  
  
var grid = new Grid.GridPanel({   
    renderTo: 'grid',   
    ds: store,   
    cm: model,   
    sm: new Grid.RowSelectionModel(),   
    autoHeight: true,   
    enableDragDrop: true,   
    ddGroup: "tgDD"  
});  
 // 使用一个Json数据结构作为tree的本地数据源
	// 参考“http://ccmv.iteye.com/admin/blogs/154049”
	var nodes = [  
		{'text' : 'SY0706', 'id' : 1, 'leaf' : false, 'cls' : 'folder', 'children' : [  
			{'text' : '1', 'id' : 11, 'leaf' : false, 'cls' : 'folder', 'children' : [
				{'text' : '01', 'id' : 111, 'leaf' : true, 'cls' : 'file'},
				{'text' : '02', 'id' : 112, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '03', 'id' : 113, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '04', 'id' : 114, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '05', 'id' : 115, 'leaf' : true, 'cls' : 'file'}  
			]}, 
			{'text' : '2', 'id' : 12, 'leaf' : false, 'cls' : 'folder', 'children' : [ 
				{'text' : '06', 'id' : 121, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '07', 'id' : 122, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '08', 'id' : 123, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '09', 'id' : 124, 'leaf' : true, 'cls' : 'file'},  
				{'text' : '10', 'id' : 125, 'leaf' : true, 'cls' : 'file'}  
			]}
		]} 
	]; 
	
	// 拖拽时需要用到的函数,用来处理添加树结点
	/*
	 * TreeNode 	node 		:	tree上的目标结点
	 * TreeNode 	refNode 	:	目标结点的子结点,用于定位新添加的结点
	 * Record Array	selections	:	从grid中选取的记录数组	
	 */
	var ddFunction = function(node, refNode, selections) {
		for(var i = 0; i < selections.length; i ++) {
			var record = selections[i];
			node.insertBefore(new Tree.TreeNode({
				text: record.get('text'),
				id: record.get('id'),
				leaf: record.get('leaf'),
				cls: record.get('cls')
			}), refNode);
		}
	}
	
	// 建一棵树,并将其设置到tgDD拖动组中
	var Tree = Ext.tree;  
	
	var tree = new Tree.TreePanel({
		renderTo: 'tree',
		animate: true,  
		loader: new Tree.TreeLoader(),
		lines: true,  
		selModel: new Ext.tree.MultiSelectionModel(),  
		containerScroll: false,
		autoHeight: true,
		root: new Tree.AsyncTreeNode({  
			text: 'BUAA',  
			draggable: false,  
			id: 0,  
			children: nodes,
			expanded: true
		}),
		enableDD: true,
		ddGroup: "tgDD",
		listeners: {
			// 监听beforenodedrop事件,主要就是在这里工作
			// 参考“http://www.iteye.com/topic/155272”中的讨论
			beforenodedrop: function(dropEvent) {
				var node = dropEvent.target;	// 目标结点
				var data = dropEvent.data;	    // 拖拽的数据
				var point = dropEvent.point;	// 拖拽到目标结点的位置
				// 如果data.node为空,则不是tree本身的拖拽,而是从grid到tree的拖拽,需要处理
				if(!data.node) {
					switch(point) {
						case 'append':
							// 添加时,目标结点为node,子结点设为空
							ddFunction(node, null, data.selections);
							break;
						case 'above':
							// 插入到node之上,目标结点为node的parentNode,子结点为node
							ddFunction(node.parentNode, node, data.selections);
							break;
						case 'below':
							// 插入到node之下,目标结点为node的parentNode,子结点为node的nextSibling
							ddFunction(node.parentNode, node.nextSibling, data.selections);
							break;
					}
				}
			}
		}
	});
	
	// grid的数据源
	var data = [  
		['11', 211, true, 'file'],
		['12', 212, true, 'file'],
		['13', 213, true, 'file'],
		['14', 214, true, 'file'],
		['15', 215, true, 'file'],
		['16', 221, true, 'file'],
		['17', 222, true, 'file'],
		['18', 223, true, 'file'],
		['19', 224, true, 'file'],
		['20', 225, true, 'file']
	];
	var store = new Ext.data.Store({
		reader: new Ext.data.ArrayReader({}, [
	       {name: 'text'},
	       {name: 'id'},
	       {name: 'leaf'},
	       {name: 'cls'}
    	])
	});
	store.loadData(data);
	// 建一个grid,并设置到tgDD拖拽组中
	var Grid = Ext.grid;
	
	var model = new Grid.ColumnModel([
	    {header: "text", width: 50, sortable: true, dataIndex: 'text'},
	    {id:'id', header: "id", width: 50, sortable: true, dataIndex: 'id'},
	    {header: "leaf", width: 50, sortable: true, dataIndex: 'leaf'},
	    {header: "cls", width: 50, sortable: true, dataIndex: 'cls'}
	]);
	
	
	var grid = new Grid.GridPanel({
		renderTo: 'grid',
		ds: store,
		cm: model,
		sm: new Grid.RowSelectionModel(),
		autoHeight: true,
		enableDragDrop: true,
		ddGroup: "tgDD"
	});

 

分享到:
评论

相关推荐

    Ext中拖拽Tree2Grid , 清空表格拖拽失效的解决办法>.<

    本文将深入探讨一个具体的使用场景——如何实现从Tree组件到Grid组件的拖拽功能,并解决在清空Grid后拖拽功能失效的问题。这个问题在实际开发中可能会遇到,尤其是在需要动态管理数据的界面中。 首先,EXTJS的Tree...

    Ext拖动实例树和表格全 超实用

    通过对Ext JS中树(Tree)和表格(Grid)控件拖拽功能的研究,我们可以看到其实现的核心在于正确配置拖动源和目标对象的相关属性,并利用`DragSource`和`DropTarget`这两个关键类来实现整个拖拽流程。掌握了这些原理和...

    ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局

    在"ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局"中,我们将会探讨以下几个核心概念: 1. **Drag and Drop(拖放)**: ExtJS4提供了完善的拖放支持,允许用户通过鼠标操作在界面上移动元素...

    EXT 控件拖动例子

    EXTJS 是一个强大的JavaScript 应用程序框架,用于构建富客户端Web应用。..."EXT 控件拖动例子"项目提供的代码可能涵盖了从基础的拖放实现到复杂的动态布局调整的完整流程,是学习EXTJS高级特性的宝贵资源。

    Ext实现的拖拽树和表格之间的拖拽

    在本文中,我们将深入探讨如何使用ExtJS框架实现拖拽功能,特别是在树形视图(Tree)和表格视图(Grid)之间的交互。ExtJS是一个强大的JavaScript库,它提供了丰富的用户界面组件,包括可拖拽的元素,这使得在Web...

    Ext拖动实例树和表格全

    根据提供的信息,我们可以深入探讨Ext JS中的拖动功能,特别是针对树(Tree)和表格(Grid)的拖动操作。本文将详细介绍这些概念和技术要点。 ### 一、Ext JS 拖动的基本概念 #### 1.1 拖动源与目标 在Ext JS中,拖动...

    ext treegrid

    在Ext JS库中,Tree通常用于展现层级关系的数据,而Grid则用于显示二维表格数据。TreeGrid将两者融合,使得用户可以在一个界面上既可以看到层级结构,又可以享受到Grid的排序、筛选、分页等功能。 "ext.ux.tree....

    EXT2.0中文教程

    4.6.1. ext中默认的提交形式 4.6.2. 使用html原始的提交形式 4.6.3. 单纯ajax 4.7. 验证苦旅 4.7.1. 不能为空 4.7.2. 最大长度,最小长度 4.7.3. 借助vtype 4.7.4. 自定义验证规则 4.7.5. 算不上校验的NumberField ...

    Ext 开发指南 学习资料

    4.6.1. ext中默认的提交形式 4.6.2. 使用html原始的提交形式 4.6.3. 单纯ajax 4.7. 验证苦旅 4.7.1. 不能为空 4.7.2. 最大长度,最小长度 4.7.3. 借助vtype 4.7.4. 自定义验证规则 4.7.5. 算不上校验的NumberField ...

    ext.net-extjs

    再加上可编辑grid,添加新行,删除一或多行,提示多行数据,拖拽改变grid大小,grid之间拖拽一或多行,甚至可以在tree和grid之间进行拖拽,啊,这些功能实在太神奇了。更令人惊叹的是,这些功能竟然都在ext表格控件...

    Ext js 教程大全

    再加上可编辑grid,添加新行,删除一或多行,提示脏数据,推拽改变grid大小,grid之间拖拽一或多行,甚至可以在tree和grid之间进行拖拽,啊,这些功能实在太神奇了。更令人惊叹的是,这些功能竟然都在ext表格控件里...

    Ext js-2.0 带API

     再加上可编辑grid,添加新行,删除一或多行,提示脏数据,推拽改变grid大小,grid之间推拽一或多行,甚至可以在tree和grid之间进行拖拽,啊,这些功能实在太神奇了。更令人惊叹的是,这些功能竟然都在ext表格控件...

    前端开发Extjs入门-tree

    通过EXT组件grid+tree+window.docx文档,你可以学习到如何在EXTJS中集成这三个组件,以及如何与后台SSM框架协作。运行截图.png可能展示了这些组件实际运行的效果。role文件可能包含了角色和权限的相关配置信息。学习...

    EXT-js-中文手册

    - **更多组件**:除了MessageBox和Grid外,EXT还提供了大量的其他组件,如Form、Tree、TabPanel等,满足不同场景的需求。 - **使用方法**:通过实例演示如何在项目中引入并使用这些组件,提高开发效率。 #### 8. ...

    Ext Js权威指南(.zip.001

    7.2.9 从变量中提取数据的代理:ext.data.proxy.memory / 314 7.2.10 使用浏览器存储的代理:ext.data.webstorageproxy、ext.data. sessionstorageproxy和ext.data.proxy.localstorage / 314 7.3 读取和格式化...

    ext实现动态树

    ExtJS可以在项目中通过CDN链接引入,或者下载安装到本地项目中。此外,还需要服务器端的支持来处理数据请求。 #### 三、核心代码解析 下面将逐步解析实现动态树形结构的核心代码。 ##### 3.1 创建树加载器 首先...

    Ext2 核心 API 中文详解

    - **拖放功能**:SimpleTasks支持将任意文本拖放到Grid中,并自动转换为新的任务。 - **剪贴板功能**:可以从系统的剪贴板粘贴新建任务。此外,还可以直接从Outlook拖动任务到SimpleTasks。 - **示例**:这种交互...

    extjs表格Grid比较全面的功能

    ExtJS Grid支持拖放功能,用户可以调整列顺序,或者将数据行拖动到不同的组或位置。 11. **组合列(Grouping Columns)** 数据可以按需分组,显示折叠/展开的层次结构,方便用户查看和操作数据。 12. **树形Grid...

    Ext表格控件和树控件

    var grid = new Ext.grid.GridPanel({ renderTo: "hello", title: "NetJava表格测试", height: 150, width: 600, columns: [ { header: "项目名称", dataIndex: "name" }, { header: "开发团队", dataIndex:...

    深入浅出Ext JS

     再加上可编辑grid,添加新行,删除一或多行,提示脏数据,推拽改变grid大小,grid之间推拽一或多行,甚至可以在tree和grid之间进行拖拽,啊,这些功能实在太神奇了。更令人惊叹的是,这些功能竟然都在ext表格控件...

Global site tag (gtag.js) - Google Analytics