jQuery MiniUI

标题: 关于TreeGrid中嵌套treeselect的问题 [打印本页]

作者: yy0033    时间: 2014-1-3 11:57:38     标题: 关于TreeGrid中嵌套treeselect的问题


功能目的: 编辑后台模块,同时给模块指定拥有权限的部门。
使用控件: 使用TreeGrid中,再绑定一个<input property="editor" class="mini-treeselect"......>
出现的问题:
第1步 选择部门列表正常
[attach]3625[/attach]
第2步 问题1出现:离开部门列表,绑定的脚是value值。我希望显示的是text.  
当整个TreeGrid提交POST时,希望数据库保存的是Jsons格式:{"id":"value","Name":"text"}
[attach]3626[/attach]
第3步 问题2出现:重新加载页面, 再次编辑部门列表,发现初始化时总有一个被漏选。
[attach]3627[/attach]

初次接触MiniUI,不知道是不是我没找对方法 ,请各位大侠帮我解析一下。 多谢了。


作者: yy0033    时间: 2014-1-3 13:11:36

怎么没有人解答呢?  

如果这个不好处理的话, 有其它办法达到同样的目的也是可以的, 麻烦大神指点下哦。
作者: factory    时间: 2014-1-3 13:29:19

yy0033 发表于 2014-1-3 13:11
怎么没有人解答呢?  

如果这个不好处理的话, 有其它办法达到同样的目的也是可以的, 麻烦大神指点下哦。 ...

列这样设置

<div field="yourField" displayField="aaa(任意取名)">部门权限</div>

试试
作者: yy0033    时间: 2014-1-3 13:52:24

本帖最后由 yy0033 于 2014-1-3 13:57 编辑
factory 发表于 2014-1-3 13:29
列这样设置

部门权限

非常感谢大神, 用你的办法显示问题解决了。
还有两个问题麻烦指教下,
1. 由于默认保存到数据库的是以逗号分隔value值,当重新加载页面时,却无法显示text文本内容了。 [attach]3629[/attach]

2. 重新加载页面后, 部门树菜单依然存在有些节点未被选中, 但实际上value值里存在。
[attach]3630[/attach]


作者: yy0033    时间: 2014-1-3 14:00:46

这是我写的代码。  请大神指点。
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.     <title></title>
  6.     <link href="/scripts/miniUI.css" rel="stylesheet" />
  7.     <script src="/scripts/boot.js"></script>
  8.     <link href="/scripts/miniui/themes/blue/skin.css" rel="stylesheet" />
  9. </head>
  10. <body>
  11.     <input type="button" value="插入节点(前)" onclick="onAddBefore()" />
  12.     <input type="button" value="插入节点(后)" onclick="onAddAfter()" />
  13.     <input type="button" value="插入节点(子节点)" onclick="onAddNode()"/>
  14.    
  15.     <!--<input type="button" value="编辑节点" onclick="onEditNode()" />-->
  16.     <input type="button" value="删除节点" onclick="onRemoveNode()" />
  17.     <input type="button" value="保存" onclick="EventSaveData()" style="margin-left: 30px; font-weight: bold;" />
  18.     <!--<input property="editor" class="mini-treeselect" multiselect="true" value="" text="" textfield="DepartmentName" valuefield="fid" parentfield="pid" checkrecursive="true" showfoldercheckbox="false" expandonload="true" showclose="true" oncloseclick="onCloseClick" popupwidth="200" url="/Control/api.ashx?method=QueryCollDepartmentInfo" />-->
  19.     <h3></h3>
  20.     <div id="tree1" class="mini-treegrid" url="/Control/api.ashx?method=QueryCollModelInfo" style="width: 1500px; padding: 5px;height:auto;"
  21.          showtreeicon="true" idfield="fid" parentfield="pid" resultastree="false" showtreeicon="true"
  22.          allowdrag="true" allowdrop="true" allowleafdropin="true" expandonnodeclick="false" treecolumn="taskname" allowresize="true" allowcellselect="true" allowcelledit="true" oncellvalidation="onCellValidation">

  23.         <div property="columns">
  24.             <div type="indexcolumn"></div>
  25.             <div field="fid" width="100">编号<input class="mini-textbox" style="width:100%;" /></div>
  26.             <div name="taskname" field="ModelName" width="220">模块名称<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  27.             <div field="ModelUrl" width="300px;">链接地址<input property="editor" class="mini-textbox" style="width:100%;" /></div>

  28.             <div field="ListPowerDepartmentID" width="100" displayfield="DepartmentName" >
  29.                 部门权限
  30.                 <input property="editor" class="mini-treeselect" multiselect="true" value="" text="" textfield="DepartmentName" valuefield="fid" parentfield="pid" checkrecursive="true" showfoldercheckbox="true" expandonload="false" showclose="true" oncloseclick="onCloseClick" popupwidth="200" url="/Control/api.ashx?method=QueryCollDepartmentInfo" />
  31.             </div>

  32.             <div field="ListPowerUser" width="100%">员工权限<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  33.             <div field="LanguageID" width="100px;">语言包ID<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  34.             <div field="RemarkInfo" width="300px;">备注<input property="editor" class="mini-textarea" style="width:100%;" /></div>
  35.         </div>
  36.     </div>

  37.     <script type="text/javascript">

  38.         function onAddBefore(e) {
  39.             var tree = mini.get("tree1");
  40.             var node = tree.getSelectedNode();

  41.             var newNode = {};
  42.             tree.addNode(newNode, "before", node);
  43.         }
  44.         function onAddAfter(e) {
  45.             var tree = mini.get("tree1");
  46.             var node = tree.getSelectedNode();            
  47.             var newNode = {};
  48.             tree.addNode(newNode, "after", node);
  49.         }
  50.         function onAddNode(e) {
  51.             var tree = mini.get("tree1");
  52.             var node = tree.getSelectedNode();

  53.             var newNode = {};
  54.             tree.addNode(newNode, "add", node);
  55.         }
  56.         function onEditNode(e) {
  57.             var tree = mini.get("tree1");
  58.             var node = tree.getSelectedNode();

  59.             tree.beginEdit(node);
  60.         }
  61.         function onRemoveNode(e) {

  62.             var tree = mini.get("tree1");
  63.             var node = tree.getSelectedNode();

  64.             if (node) {
  65.                 if (confirm("确定删除选中节点?")) {
  66.                     tree.removeNode(node);
  67.                     EventRemoveNode(node);
  68.                 }
  69.             }
  70.         }
  71.         function onMoveNode(e) {
  72.             var tree = mini.get("tree1");
  73.             var node = tree.getSelectedNode();

  74.             alert("moveNode");
  75.         }
  76.         function EventSaveData() {
  77.             var tree = mini.get("tree1");
  78.             var data = tree.getData();
  79.             var json = mini.encode(data);
  80.             var msgid = mini.loading("数据保存中,请稍后......", "保存数据");

  81.             $.ajax({
  82.                 url: "/Control/api.ashx?method=InsertCollModeInfo",
  83.                 data: { data: json },
  84.                 type: "post",
  85.                 success: function (text) {
  86.                     mini.hideMessageBox(msgid);
  87.                     tree.load("/Control/api.ashx?method=QueryCollModelInfo");
  88.                 },
  89.                 error: function (jqXHR, textStatus, errorThrown) {
  90.                     alert(jqXHR.responseText);
  91.                 }
  92.             });
  93.         }

  94.         function EventRemoveNode(node)
  95.         {
  96.             var tree = mini.get("tree1");
  97.             var json = node.length <= 0 ? null : mini.encode(node);            
  98.             var msgid = mini.loading("数据删除中,请稍后......", "删除数据");

  99.             $.ajax({
  100.                 url: "/Control/api.ashx?method=DeleteCollModeInfo",
  101.                 data: { data: json },
  102.                 type: "post",
  103.                 success: function (text) {
  104.                     mini.hideMessageBox(msgid);
  105.                 },
  106.                 error: function (jqXHR, textStatus, errorThrown) {
  107.                     alert(jqXHR.responseText);
  108.                 }
  109.             });
  110.         }

  111.         function onCloseClick(e) {
  112.             var obj = e.sender;
  113.             obj.setText("");
  114.             obj.setValue("");
  115.         }


  116.         function ondrawcell(e)
  117.         {
  118.             var tree = e.sender;
  119.             var node = e.node;
  120.             
  121.             if (e.field == 'ListPowerDepartmentID') {
  122.                 e.cellHtml = "12321321";
  123.             }
  124.         }
  125.     </script>

  126. </body>
  127. </html>
复制代码

作者: factory    时间: 2014-1-3 14:30:20

yy0033 发表于 2014-1-3 14:00
这是我写的代码。  请大神指点。

你应该是这样,你加上displayField="DepartmentName" ,getChanges()获取出来的行数据,内部其实是给你加上了这个DepartmentName字段了,所以你最好把DepartmentName也保存到数据库

因为你这个的值是逗号分隔的,跟单选的combobox还不太一样,你应该提供的数据是这样
{id:"1", ListPowerDepartmentID:"xxxx",DepartmentName:"文本"}
然后field="ListPowerDepartmentID"  displayField="DepartmentName",这样treegrid才只知道你的显示文本是什么


作者: yy0033    时间: 2014-1-3 14:47:15

factory 发表于 2014-1-3 14:30
你应该是这样,你加上displayField="DepartmentName" ,getChanges()获取出来的行数据,内部其实是给你加上 ...

在哪儿触发getChanges(), 是Mini的涵数吗?
如果提供的数据必需是{id:"1", ListPowerDepartmentID:"xxxx",DepartmentName:"文本"}, 那么保存到数据库的就不应该是逗号分隔了, 而是这个JSON格式。   请问这个要怎么实现呀?
能否写一个简单的DEMO看看呢。
作者: factory    时间: 2014-1-3 14:52:40

本帖最后由 factory 于 2014-1-3 14:53 编辑
yy0033 发表于 2014-1-3 14:47
在哪儿触发getChanges(), 是Mini的涵数吗?
如果提供的数据必需是{id:"1", ListPowerDepartmentID:"xxxx ...

我就是用getChanges()举个获取行对象的例子.
反正只要你的列上有displayFiled, 那么只要当你修改完数据之后,原本的数据中,就自动会给你加上displayField的字段值
比如你原来数据是{id:"1",name:"2"}

你的列是field ="name" displayField = "sssss"
那么你编辑完name这一列之后,你的数据自然而然会增加为 {id:"1",name:"2",sssss:"文本"}
你把sssss也可以保存到数据库,下次读取的时候,我们就能从sssss上知道你的name这一列的文本显示displayField="sssss"应该是什么文本了

作者: yy0033    时间: 2014-1-3 16:06:35

本帖最后由 yy0033 于 2014-1-3 16:10 编辑
factory 发表于 2014-1-3 14:52
我就是用getChanges()举个获取行对象的例子.
反正只要你的列上有displayFiled, 那么只要当你修改完数据之 ...

折腾了一个小时,还是没太明白。
应该在哪儿触发getChanges()事件呢?
  1. <div id="tree1" class="mini-treegrid" url="/Control/api.ashx?method=QueryCollModelInfo" style="width: 1500px; padding: 5px;height:auto;"
  2.          showtreeicon="true" idfield="fid" parentfield="pid" resultastree="false" showtreeicon="true" ondrawcell="onDrawCell"
  3.          allowdrag="true" allowdrop="true" allowleafdropin="true" expandonnodeclick="false" treecolumn="taskname" allowresize="true" allowcellselect="true" allowcelledit="true" oncellvalidation="onCellValidation">

  4.         <div property="columns">
  5.             <div type="indexcolumn"></div>
  6.             <div field="fid" width="100">编号<input class="mini-textbox" style="width:100%;" /></div>
  7.             <div name="taskname" field="ModelName" width="220">模块名称<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  8.             <div field="ModelUrl" width="300px;">链接地址<input property="editor" class="mini-textbox" style="width:100%;" /></div>

  9.             <div field="ListPowerDepartmentID" width="100" displayfield="DepartmentName">
  10.                 部门权限
  11.                 <input property="editor" class="mini-treeselect" multiselect="true" value="" text="" textfield="DepartmentName" valuefield="fid" parentfield="pid" checkrecursive="true" showfoldercheckbox="true" expandonload="false" showclose="true" oncloseclick="onCloseClick" popupwidth="200" url="/Control/api.ashx?method=QueryCollDepartmentInfo" />
  12.             </div>
  13.             <div field="ListPowerUser" width="100%">员工权限<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  14.             <div field="LanguageID" width="100px;">语言包ID<input property="editor" class="mini-textbox" style="width:100%;" /></div>
  15.             <div field="RemarkInfo" width="300px;">备注<input property="editor" class="mini-textarea" style="width:100%;" /></div>
  16.         </div>
  17.     </div>
  18. //加载时使用onDrawCell,那修改时应该用哪个方法触发?
  19. function onDrawCell(e)
  20.         {
  21.             var data = e.field;
  22.             if (e.field == "ListPowerDepartmentID")
  23.                 alert(e.node["ListPowerDepartmentID"]);


  24.         }
复制代码



作者: factory    时间: 2014-1-3 16:09:19

yy0033 发表于 2014-1-3 16:06
折腾了一个小时,还是没太明白。
应该在哪儿触发getChanges()事件呢?

你不需要管getChanges()的啊

我只是举个获取行对象的方法例子而已

我就是告诉你,你只要指明了displayField, 那么行数据中,自然就会给你加上displayField字段,你可以用这个把单元格文本保存起来
作者: yy0033    时间: 2014-1-3 16:18:27

factory 发表于 2014-1-3 16:09
你不需要管getChanges()的啊

我只是举个获取行对象的方法例子而已

不是很明白。 我已经指定了displayfield="DepartmentName",然后修改部门列表,再点击保存按钮, 再去数据库中查看依然只有逗号分隔的value值。   还需要怎么做呢?
不好意思,有点没想通,麻烦你了。
  1. <div field="ListPowerDepartmentID" width="100" displayfield="DepartmentName">
  2.                 部门权限
  3.                 <input property="editor" class="mini-treeselect" multiselect="true" value="" text="" textfield="DepartmentName" valuefield="fid" parentfield="pid" checkrecursive="true" showfoldercheckbox="true" expandonload="false" showclose="true" oncloseclick="onCloseClick" popupwidth="200" url="/Control/api.ashx?method=QueryCollDepartmentInfo" />
  4.             </div>
复制代码

作者: felt    时间: 2014-1-3 16:27:20

yy0033 发表于 2014-1-3 16:18
不是很明白。 我已经指定了displayfield="DepartmentName",然后修改部门列表,再点击保存按钮, 再去数 ...

displayfield="DepartmentName"
需要你的数据有DepartmentName字段,这样加载的时候页面上才能显示出来
datagrid的数据是这样的{total:20,data:[{id:xxx,a:"aaa",b:"bbb"},xxxxxxx]}
你现在的问题是啥?
作者: yy0033    时间: 2014-1-3 16:57:06

felt 发表于 2014-1-3 16:27
displayfield="DepartmentName"
需要你的数据有DepartmentName字段,这样加载的时候页面上才能显示出来
d ...

理论上来讲,正确的JSON原数据应该是这样子的:
{"total":"20","ModelName":"模块名称","ListPowerDepartmentID":[{"DepartmentID":"1",DepartmentName}其中红色部份就是嵌套的部门列表信息。 这个理解应该没错吧。

但是初始化时数据库中ListPowerDepartmentID是为空值,需要页面拼接这个子JSON字符串,再保存到数据库。
现在我不知道应该怎么拼接这个字符串。

作者: yy0033    时间: 2014-1-3 16:59:33

felt 发表于 2014-1-3 16:27
displayfield="DepartmentName"
需要你的数据有DepartmentName字段,这样加载的时候页面上才能显示出来
d ...

我大概明白你的意思了。  我的C#代码实体类中ListPowerDepartmentID不能为字符串, 而应该是一个子实体类。  包含有部门ID号与部门名称。  
我先去试一下。
作者: yy0033    时间: 2014-1-3 17:18:25

还是不行~  HTML页面传入到后台代码中依然为逗号分隔的value值。
是不是页面代码需要怎么改一下?
作者: niko    时间: 2014-1-3 17:33:30

我们只能给你ListPowerDepartmentID和ListPowerDepartmentName两个字段,这两个字段分别都是,号隔开的,你后台自己处理转换。
作者: yy0033    时间: 2014-1-3 18:02:23

niko 发表于 2014-1-3 17:33
我们只能给你ListPowerDepartmentID和ListPowerDepartmentName两个字段,这两个字段分别都是,号隔开的,你 ...

那也可以。  但点保存提交到后台代码中时, POST的数据里面依然没有PowerDepartmentName。  只有用逗号分隔的ID值。
作者: niko    时间: 2014-1-4 17:43:41

你的列需要定义
field="PowerDepartmentID" displayField="PowerDepartmentName"




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