jQuery MiniUI

标题: treeGrid CellEdit 单元格编辑 控件 数值统计的问题 [打印本页]

作者: 朱杰兵    时间: 2014-2-24 09:38:03     标题: treeGrid CellEdit 单元格编辑 控件 数值统计的问题



如何才能实现子节点的数值输入后,将总值自动进行统计显示到父节点。 求高手解答,谢谢。


作者: factory    时间: 2014-2-24 10:20:53

var pnode = tree.getParentNode(node) 当前节点的获取到 父节点
tree.eachChild(pnode,function(node){
     node...
})    //遍历该父节点下面的子节点,并且计算统计

tree.updateRow(pnode:{field:value})   把value统计值更新到父节点上的field字段
作者: 朱杰兵    时间: 2014-2-24 14:37:50

factory 发表于 2014-2-24 10:20
var pnode = tree.getParentNode(node) 当前节点的获取到 父节点
tree.eachChild(pnode,function(node){
   ...

大哥,能说详细一点吗?我不知道怎么下手写呢。
<div id="datagrid1" name="datagrid1" class="mini-treegrid" style="width:100%;height:280px;"     
    url="" showTreeIcon="true"
    treeColumn="taskname" idField="ahax0077" parentField="azfx0053" resultAsTree="false"  
    allowResize="true" expandOnLoad="true"
    allowCellEdit="true" allowCellSelect="true"
>
    <div property="columns">
        <div type="indexcolumn"></div>
        <div name="taskname" field="typeName" width="160" >收入项名称
            <input property="editor" class="mini-textbox" style="width:100%;" />
        </div>
                <div field="ahax0077" name="ahax0077" width="80">业务类型编号
            <input property="editor" class="mini-spinner"  minValue="0" maxValue="100" value="0" style="width:100%;"/>
        </div>
        <div field="ahax0078" name="ahax0078" width="80">金额
            <input property="editor" class="mini-spinner"  minValue="0" maxValue="9999999999" value="0" decimalPlaces="2" maxLength="10" allowLimitValue="false" style="width:100%;" onvaluechanged="change"/>
        </div>
        <div field="ahax0081" width="60" headerAlign="center">说明
            <input property="editor" class="mini-textbox" vtype="maxLength:150" maxLength="100" style="width:100%;"/>
        </div>
                              
    </div>
</div>
我把代码贴给你看看,帮忙再指点一下,小弟愚钝。感谢。
作者: factory    时间: 2014-2-24 15:57:13

朱杰兵 发表于 2014-2-24 14:37
大哥,能说详细一点吗?我不知道怎么下手写呢。

   

var pnode = tree.getParentNode(node) //当前节点的获取到 父节点
tree.eachChild(pnode,function(node){
     var value = node.yourField;
     .....获取到value之后,进行统计计算
})    //遍历该父节点下面的子节点,并且计算统计

tree.updateRow(pnode:{field:value})   //把value统计值更新到父节点上的field字段

就这几步,1,3步是固定的,你就需要在eachChild里面进行一个计算就行了
作者: 朱杰兵    时间: 2014-2-24 16:11:37

factory 发表于 2014-2-24 15:57
var pnode = tree.getParentNode(node) //当前节点的获取到 父节点
tree.eachChild(pnode,function(node) ...

感谢!
第一步的tree 是var tree = mini.get("datagrid1");    ??

【var pnode = tree.getParentNode(node) //当前节点的获取到 父节点】
参数node指的是哪一个值呢?因为我url里面传递过来的字段有很多,指的是哪一个呢?我试了一下,返回的是undefined。

谢谢指点。
作者: felt    时间: 2014-2-24 16:14:29

本帖最后由 felt 于 2014-2-24 16:15 编辑
朱杰兵 发表于 2014-2-24 16:11
感谢!
第一步的tree 是var tree = mini.get("datagrid1");    ??

你这个肯定是监听oncellendedit来处理的
编辑结束的时候
根据e.row来查找父节点,再遍历计算结果,更新父节点
作者: factory    时间: 2014-2-24 16:15:04

朱杰兵 发表于 2014-2-24 16:11
感谢!
第一步的tree 是var tree = mini.get("datagrid1");    ??

恩,你得先获取到mini-tree控件对象,才能使用他的API,

var pnode = tree.getParentNode(node)

参数node是你要获取的父节点下的子节点对象
作者: 朱杰兵    时间: 2014-2-24 16:30:03

factory 发表于 2014-2-24 16:15
恩,你得先获取到mini-tree控件对象,才能使用他的API,

var pnode = tree.getParentNode(node)

参数node是你要获取的父节点下的子节点对象  这个对象怎么得到呢?
感谢。
作者: 朱杰兵    时间: 2014-2-24 17:15:31

factory 发表于 2014-2-24 16:15
恩,你得先获取到mini-tree控件对象,才能使用他的API,

var pnode = tree.getParentNode(node)

tree.updateRow(pnode:{field:value}) ; 报了一个脚本错误 少括号。麻烦看一下,前面已经解决掉了。
谢谢
作者: lost    时间: 2014-2-24 17:22:20

朱杰兵 发表于 2014-2-24 17:15
tree.updateRow(pnode:{field:value}) ; 报了一个脚本错误 少括号。麻烦看一下,前面已经解决掉了。
谢谢 ...

tree.updateRow(pnode,{field:value}) ;
作者: 朱杰兵    时间: 2014-2-24 17:32:21

lost 发表于 2014-2-24 17:22
tree.updateRow(pnode,{field:value}) ;

谢谢。改过来了,但现在遇到一个问题 就是
var num = 0;
                        grid.eachChild(pnode,function(node){
                            // node...
                            var value = node.ahax0078;
                           // alert(value);
                            num = num+value;
                        })
编辑某一行触发以后var value = node.ahax0078; 取不到当前行的值,只能取到其他行的值。
谢谢
作者: lost    时间: 2014-2-24 17:34:50

朱杰兵 发表于 2014-2-24 17:32
谢谢。改过来了,但现在遇到一个问题 就是
var num = 0;
                        grid.eachChild(pnode,function(node){
  1. var tree = mini.get("treegrid1");
  2.         var node = tree.getSelectedNode();
  3.         var pnode = tree.getParentNode(node);
  4.         var total = 0;
  5.         tree.eachChild(pnode, function (node) {
  6.             
  7.             var t = node.PercentComplete;
  8.             total += t;
  9.             tree.updateRow(pnode, { Name: total });
  10.         });  //试下行不行
复制代码

作者: factory    时间: 2014-2-24 17:40:03

朱杰兵 发表于 2014-2-24 17:32
谢谢。改过来了,但现在遇到一个问题 就是
var num = 0;
                        grid.eachChild(pnode,function(node){

eachChild是遍历所有的子节点,不仅仅是当前节点,你单步执行查看,看到的不一定就是当前编辑的子节点了,
你如果要汇总统计,肯定得要获取到所有子节点的值来计算,那肯定需要遍历下
作者: factory    时间: 2014-2-24 17:40:04

朱杰兵 发表于 2014-2-24 17:32
谢谢。改过来了,但现在遇到一个问题 就是
var num = 0;
                        grid.eachChild(pnode,function(node){

eachChild是遍历所有的子节点,不仅仅是当前节点,你单步执行查看,看到的不一定就是当前编辑的子节点了,
你如果要汇总统计,肯定得要获取到所有子节点的值来计算,那肯定需要遍历下
作者: 朱杰兵    时间: 2014-2-24 17:41:21

lost 发表于 2014-2-24 17:34

var t = node.PercentComplete; alert出来时undefined
谢谢
作者: factory    时间: 2014-2-24 17:44:17

朱杰兵 发表于 2014-2-24 17:41
var t = node.PercentComplete; alert出来时undefined
谢谢

调试下,undefined的node有没有PercentComplete值
作者: 朱杰兵    时间: 2014-2-24 17:51:05

factory 发表于 2014-2-24 17:44
调试下,undefined的node有没有PercentComplete值

var value =  node.PercentComplete;
alert(value);
underfiend
作者: factory    时间: 2014-2-24 17:52:39

朱杰兵 发表于 2014-2-24 17:51
var value =  node.PercentComplete;
alert(value);
underfiend

你的节点有没有这个PercentComplete字段啊?没有的话自然undefined的了,这明显是你数据的问题
作者: 朱杰兵    时间: 2014-2-24 17:53:10

factory 发表于 2014-2-24 17:40
eachChild是遍历所有的子节点,不仅仅是当前节点,你单步执行查看,看到的不一定就是当前编辑的子节点了,
你 ...

我是用的onvaluechanged事件来触发统计操作的。但是无法取到当前编辑行的值,只有编辑其他行的时候才能取到之前行的值。
作者: factory    时间: 2014-2-24 17:55:43

朱杰兵 发表于 2014-2-24 17:53
我是用的onvaluechanged事件来触发统计操作的。但是无法取到当前编辑行的值,只有编辑其他行的时候才能取 ...

我都完全不知道你是怎么操作的了...表格归表格,编辑器归编辑器.

你要获取表格的数据,自然要通过表格的事件, 不要监听编辑器ovaluechanged事件,监听表格的oncellendedit事件去处理,或者oncellcommitedit
作者: 朱杰兵    时间: 2014-2-24 17:56:16

factory 发表于 2014-2-24 17:52
你的节点有没有这个PercentComplete字段啊?没有的话自然undefined的了,这明显是你数据的问题 ...

汗,知道了,谢谢,但是还有一个问题,触发统计操作的时候没法取到当前行编辑的值,只有编辑其他行的时候才能取到之前行的值。
作者: factory    时间: 2014-2-24 17:58:56

朱杰兵 发表于 2014-2-24 17:56
汗,知道了,谢谢,但是还有一个问题,触发统计操作的时候没法取到当前行编辑的值,只有编辑其他行的时候 ...

如果你是监听表格编辑事件的
function xxx(e){
var row = e.row

var index = grid.indexOf(row)

var row2 = grid.getRow(index-1);  前一行数据

}
作者: 朱杰兵    时间: 2014-2-24 18:03:45

factory 发表于 2014-2-24 17:55
我都完全不知道你是怎么操作的了...表格归表格,编辑器归编辑器.

你要获取表格的数据,自然要通过表格的事 ...

监听表格的oncellendedit事件去处理,或者oncellcommitedit  这个怎么写呢?谢谢
作者: 朱杰兵    时间: 2014-2-24 18:21:32

factory 发表于 2014-2-24 17:58
如果你是监听表格编辑事件的
function xxx(e){
var row = e.row

搞定了,谢谢你们。太感谢了、。
作者: factory    时间: 2014-2-24 18:21:44

朱杰兵 发表于 2014-2-24 18:03
监听表格的oncellendedit事件去处理,或者oncellcommitedit  这个怎么写呢?谢谢

oncellendedit="oncellendedit"

function oncellendedit(e){
   e.row,e.column,e.field,e.editor....
}

具体的我不列了,API上都有
作者: 朱杰兵    时间: 2014-2-24 18:22:12

lost 发表于 2014-2-24 17:34

搞定了,太感谢了。谢谢
作者: 朱杰兵    时间: 2014-2-25 13:57:00

factory 发表于 2014-2-24 10:20
var pnode = tree.getParentNode(node) 当前节点的获取到 父节点
tree.eachChild(pnode,function(node){
   ...

大哥,帮忙看看这个问题,http://www.miniui.com/bbs/forum. ... id=25045&extra=
谢谢。
作者: 朱杰兵    时间: 2014-2-25 13:57:49

lost 发表于 2014-2-24 17:22
tree.updateRow(pnode,{field:value}) ;

忙吗?帮忙看看这个问题,http://www.miniui.com/bbs/forum. ... id=25045&extra=
谢谢。
作者: 朱杰兵    时间: 2014-3-6 09:39:14

factory 发表于 2014-2-24 10:20
var pnode = tree.getParentNode(node) 当前节点的获取到 父节点
tree.eachChild(pnode,function(node){
   ...

现在出现了一个这样的问题,我用oncellendedit="segmentValueVhanged" 监听表格,但是有时候编辑子节点以后,无法统计,只有当第二次点击当前父节点下的子节点,才会统计。  就是第一次编辑后,统计失效了。
function segmentValueVhanged(e){
                  var node = grid.getSelectedNode();
                 // alert(node.typeName);
              var pnode = grid.getParentNode(node); //当前节点的获取到 父节点
              var ppnode = grid.getParentNode(pnode);
              var num = 0;
              var num2 = 0;
              //遍历该父节点下面的子节点,并且计算统计
                        grid.eachChild(pnode,function(node){
                            // node...
                            var value = node.ahax0078;
                            num = num+value;
                            grid.updateRow(pnode,{ahax0078:num}); //把num统计值更新到父节点上的field字段
                        })   
                       
                        grid.eachChild(ppnode,function(pnode){
                            // node...
                            var value = pnode.ahax0078;
                            num2 = num2+value;
                            grid.updateRow(ppnode,{ahax0078:num2});//把num2统计值更新到父节点上的field字段
                        })   
                          
                       
        }
作者: 朱杰兵    时间: 2014-3-6 09:39:45

lost 发表于 2014-2-24 17:22
tree.updateRow(pnode,{field:value}) ;

现在出现了一个这样的问题,我用oncellendedit="segmentValueVhanged" 监听表格,但是有时候编辑子节点以后,无法统计,只有当第二次点击当前父节点下的子节点,才会统计。  就是第一次编辑后,统计失效了。
function segmentValueVhanged(e){
                  var node = grid.getSelectedNode();
                 // alert(node.typeName);
              var pnode = grid.getParentNode(node); //当前节点的获取到 父节点
              var ppnode = grid.getParentNode(pnode);
              var num = 0;
              var num2 = 0;
              //遍历该父节点下面的子节点,并且计算统计
                        grid.eachChild(pnode,function(node){
                            // node...
                            var value = node.ahax0078;
                            num = num+value;
                            grid.updateRow(pnode,{ahax0078:num}); //把num统计值更新到父节点上的field字段
                        })   
                       
                        grid.eachChild(ppnode,function(pnode){
                            // node...
                            var value = pnode.ahax0078;
                            num2 = num2+value;
                            grid.updateRow(ppnode,{ahax0078:num2});//把num2统计值更新到父节点上的field字段
                        })   
                          
                       
        }
作者: factory    时间: 2014-3-6 10:02:44

朱杰兵 发表于 2014-3-6 09:39
现在出现了一个这样的问题,我用oncellendedit="segmentValueVhanged" 监听表格,但是有时候编辑子节点以 ...

你的updateRow为什么要放eachChild里面啊?

eachChild应该支持循环计算统计,以便计算出总和

updateRow只需要一次,就是在你编辑完,执行完计算,有结果之后,更新一下父节点即可了.不需要你遍历子节点的时候,每遍历一次,更新一次父节点


作者: 朱杰兵    时间: 2014-3-6 10:14:32

factory 发表于 2014-3-6 10:02
你的updateRow为什么要放eachChild里面啊?

eachChild应该支持循环计算统计,以便计算出总和

好的。现在的问题是我一个父节点下面只有一个子节点,我在子节点编辑相应的数值后,只有再次点击这个子节点才会进行统计。这个问题该怎么解决呢?能不能监听我在修改某一行的数值以后,就自动进行统计呢?而不是再点击当前父节点下的其它行时才进行统计。
作者: lost    时间: 2014-3-6 10:26:29

朱杰兵 发表于 2014-3-6 10:14
好的。现在的问题是我一个父节点下面只有一个子节点,我在子节点编辑相应的数值后,只有再次点击这个子节 ...

cellendedit是编辑结束是激发的事件,当你编辑结束,你鼠标点击空白处就会激发cellendedit事件。
不需要点击当前父节点下的其他子节点来进行统计的。
作者: 朱杰兵    时间: 2014-3-6 10:36:35

lost 发表于 2014-3-6 10:26
cellendedit是编辑结束是激发的事件,当你编辑结束,你鼠标点击空白处就会激发cellendedit事件。
不需要 ...

我编辑完一个父节点下的某一行,我就点击另一个父节点下的某一行进行编辑,那之前父节点就不会进行统计了。触发统计的是第二次点击的另一个父节点了。这样就会把之前编辑的给漏掉了。谢谢。有没有办法能够在编辑的时候就触发进行统计呢?能够监听键盘的输入。   非常感谢。
作者: factory    时间: 2014-3-6 12:00:34

朱杰兵 发表于 2014-3-6 10:36
我编辑完一个父节点下的某一行,我就点击另一个父节点下的某一行进行编辑,那之前父节点就不会进行统计了 ...

你编辑的时候,录入的值是在编辑器上的,只有当结束编辑,才会把值给到单元格和行数据上.
作者: 朱杰兵    时间: 2014-3-6 12:11:35

factory 发表于 2014-3-6 12:00
你编辑的时候,录入的值是在编辑器上的,只有当结束编辑,才会把值给到单元格和行数据上. ...

那这个问题有什么解决方案呢?帮忙。感谢。
我现在碰到的问题是,某一个父节点下只有一个子节点,我编辑完这个子节点后,就去编辑另一个父节点下的子节点,这样的话前一个编辑就没有进行统计了。非常感谢。
作者: factory    时间: 2014-3-6 12:50:31

朱杰兵 发表于 2014-3-6 12:11
那这个问题有什么解决方案呢?帮忙。感谢。
我现在碰到的问题是,某一个父节点下只有一个子节点,我编辑 ...

边编辑,边汇总,只能把你目前编辑的节点的值,通过编辑器获取值出来,e.editor是当前编辑器对象,并且需要监听编辑器的onkeyup事件
作者: 朱杰兵    时间: 2014-3-6 13:33:57

factory 发表于 2014-3-6 12:50
边编辑,边汇总,只能把你目前编辑的节点的值,通过编辑器获取值出来,e.editor是当前编辑器对象,并且需要监 ...

具体怎么实现呢?麻烦说的具体一点,谢谢。之前的取父节点,遍历父节点的代码都需要改吗?感谢。
作者: factory    时间: 2014-3-6 14:15:56

朱杰兵 发表于 2014-3-6 13:33
具体怎么实现呢?麻烦说的具体一点,谢谢。之前的取父节点,遍历父节点的代码都需要改吗?感谢。 ...

监听编辑器的onkeyup事件,遍历子节点肯定还是需要的,因为你得计算汇总.但是遍历的时候,你目前正在编辑的那个节点的数据就不要遍历计算进去了.因为这个节点计算的应该是你目前编辑器的值,而不是节点的数据

当然修改计算汇总的算法还有其他的,比如你可以定义一个存放上一次keyup的编辑器值变量A,用来存放你上一次keyup计算的编辑值, 下一次keyup的时候,因为改变的只有你编辑的节点的数据,其他节点数据都不变,可以 父节点的 汇总 - A +newValue  这样可以避免不断得重复遍历相加去获取最新的汇总

具体怎么做,你自己考虑
作者: 朱杰兵    时间: 2014-3-11 23:11:31

本帖最后由 朱杰兵 于 2014-3-11 23:18 编辑
felt 发表于 2014-2-24 16:14
你这个肯定是监听oncellendedit来处理的
编辑结束的时候
根据e.row来查找父节点,再遍历计算结果,更新父 ...

demo里面有一个这样的例子,单选框 性别 ,源码用的是select option

来加载多选和单选框,但是这样的话总是会有一个默认选中,该怎么解决呢?不让默认选中。感谢,谢谢
作者: 朱杰兵    时间: 2014-3-11 23:17:14

lost 发表于 2014-2-24 17:22
tree.updateRow(pnode,{field:value}) ;

demo里面有一个这样的例子,单选框 性别 ,源码用的是select option

来加载多选和单选框,但是这样的话总是会有一个默认选中,该怎么解决呢?感谢,谢谢
作者: factory    时间: 2014-3-12 09:50:03

朱杰兵 发表于 2014-3-11 23:17
demo里面有一个这样的例子,单选框 性别 ,源码用的是select option

来加载多选和单选框,但是这样的话 ...

你说的是哪个例子?
作者: 朱杰兵    时间: 2014-3-12 13:06:17

factory 发表于 2014-3-12 09:50
你说的是哪个例子?

表格控件里面的datagrid,demo里面新增页面有一个性别 ,源码就是那样的。<select><option></option></select>
作者: factory    时间: 2014-3-12 15:57:47

朱杰兵 发表于 2014-3-12 13:06
表格控件里面的datagrid,demo里面新增页面有一个性别 ,源码就是那样的。

不要用select标签,select默认就会选中第一个

用div,看我们radiobuttonlist的demo




欢迎光临 jQuery MiniUI (http://miniui.com/discuss/) Powered by Discuz! X2