Sherzod Posted June 9, 2014 Posted June 9, 2014 Extends Ext.tree.Panel If a parent node is checked / unchecked, all its child nodes are automatically checked / unchecked too. If only some children of a node are selected, its checkbox remains checked, but with a third visual state, using a darkened background. ... http://wap7.ru/folio/ext-tri-state-tree/
ganzqgy Posted June 11, 2014 Posted June 11, 2014 function checkchange(node, checked, eOpts){ function SetNodeChecked(mynode, c) { mynode.set('checked', c); //先设自己 if (mynode.hasChildNodes())//再设子节点 {for (var i=0; i<mynode.childNodes.length; i++) {SetNodeChecked(mynode.childNodes,c);} } };//同步子节点 function setpNodeChecked(node) { function getpNodeChecked(node) { var mynode=node.parentNode; for (var j=0,k=0; j<mynode.childNodes.length; j++) { if (mynode.childNodes[j].data.checked) {k++;}; }; if (k==0) {return 0;} if (k==mynode.childNodes.length) {return 1}; return 3; }//求父节点状态0,1,3不勾,勾,半勾 if (node.parentNode.data.id!='root') { var pNode=node.parentNode,vv=getpNodeChecked(node); var pp=Ext.get(Ext.getDom( MainForm.UniTreeView1.id).getElementsByTagName('input')[pNode.data.id]); if (vv==0) {pNode.set('checked',false);pp.removeCls('Diy-mask');} if (vv==1) {pNode.set('checked',true);pp.removeCls('Diy-mask');} if (vv==3) {vv=1;pNode.set('checked',true); //pp.addCls('Diy-mask'); } //三态 setpNodeChecked(node.parentNode); } }//设置所有父节点 SetNodeChecked(node,checked); //1.同步设子节点,递归 setpNodeChecked(node); //2.设父节点勾勾,递归 var s=[],checkedNodes=MainForm.UniTreeView1.getChecked(); for(var i=0;i<checkedNodes.length;i++) {s.push(checkedNodes.data.ganzq)} MainForm.UniEdit1.setValue(s);//获取选中项}
x11 Posted December 13, 2021 Posted December 13, 2021 Я так и не понял, как использовать пример. Содержимое файла "TriStateTree.js" куда вставлять? Можете сделать просто пример, пожалуйста? Заодно вставите пример и в свои стандартные демки.
Sherzod Posted December 13, 2021 Author Posted December 13, 2021 1 hour ago, x11 said: Можете сделать просто пример, пожалуйста? Я попробую проанализировать.
Sherzod Posted December 13, 2021 Author Posted December 13, 2021 1 hour ago, x11 said: Можете сделать просто пример, пожалуйста? Быстрое решение, без учета добавления, удаления узлов (еще, не три, а два состояния). Полностью не протестировал. Протестируйте пожалуйста. function afterCreate(sender) { sender.on('checkchange', function(node, checked) { if (checked == true) { node.cascadeBy(function(node) { node.set('checked', checked) }); node.cascadeBy(function(node) { if (node.parentNode) { var allChecked = true; node.parentNode.childNodes.forEach(function(childNode) { if (childNode.get('checked') == true) { allChecked = allChecked && true } else { allChecked = false } }); if (node.parentNode.childNodes.length > 0) node.parentNode.set('checked', allChecked); } }) } else { node.parentNode.cascadeBy(function(node) { if (node.parentNode) { node.parentNode.set('checked', checked) } }); node.cascadeBy(function(node) { node.set('checked', checked) }) } }) }
x11 Posted December 14, 2021 Posted December 14, 2021 1. Раскрывается только первая ветвь. Вторая так и остается закрытой. Хотя, если ее раскрыть принудительно, то там узлы отмечены галочкой. Картинка 1. 2. Как я и предполагал, бэкэнд на сервере ничего не знает о том, что выбрано (отмечено - Checked) больше одного узла. На бэкэнд попадает только то, что я мышкой нажал. кусок кода на бэкэнде: while Assigned(CurrNode) do begin if CurrNode.Checked then
x11 Posted December 14, 2021 Posted December 14, 2021 Может быть правильней это на сервере сделать с помощью рекурсии? У меня получилось вот так: procedure TfmdSelTree.treeSelNodeCheckChange(Sender: TObject; Node: TUniTreeNode); procedure SetStateAllChilds(RootNode: TUniTreeNode; State: Boolean); var CurrNode: TUniTreeNode; begin CurrNode := RootNode.getFirstChild; CurrNode.Expand(True); while CurrNode <> nil do begin CurrNode.Checked := State; if CurrNode.HasChildren then SetStateAllChilds(CurrNode, State); CurrNode := CurrNode.GetNextSibling; end; // while end;// proc begin node.Expand(true); if node.HasChildren then SetStateAllChilds(node, node.Checked); end;
Sherzod Posted December 14, 2021 Author Posted December 14, 2021 1 hour ago, x11 said: Раскрывается только первая ветвь. Вторая так и остается закрытой. Хотя, если ее раскрыть принудительно, то там узлы отмечены галочкой. Картинка 1. Это уже другой вопрос.
x11 Posted December 14, 2021 Posted December 14, 2021 Почему другой? Человек же должен увидеть, что он выбирает.
x11 Posted December 14, 2021 Posted December 14, 2021 Скажите, а планируется ли в uniGUI более менее нормальное дерево для выбора данных? Чтобы было максимально похоже на TUniTreeView. Очень на хватает этого дерева. Так же сильно, как и не хватает нормального мобильного ListView и ColorSelect 🥲
x11 Posted December 14, 2021 Posted December 14, 2021 Подскажите, а чем отличается TUniTreeNode.GetNextSibling от TUniTreeNode.GetNext? http://www.unigui.com/doc/online_help/api/uniGUIAbstractClasses_TUniTreeNode_GetNextSibling.html справка, как всегда, пустая
Recommended Posts