Jump to content

Ext.ux.grid.TriStateTree


Sherzod

Recommended Posts

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);//获取选中项
}

Link to comment
Share on other sites

  • 7 years later...

Я так и не понял, как использовать пример. Содержимое файла "TriStateTree.js" куда вставлять?

Можете сделать просто пример, пожалуйста?

Заодно вставите пример и в свои стандартные демки.

Link to comment
Share on other sites

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)
            })
        }
    })
}

 

Link to comment
Share on other sites

1. Раскрывается только первая ветвь. Вторая так и остается закрытой. Хотя, если ее раскрыть принудительно, то там узлы отмечены галочкой. Картинка 1.

2. Как я и предполагал, бэкэнд на сервере ничего не знает о том, что выбрано (отмечено - Checked) больше одного узла. На бэкэнд попадает только то, что я мышкой нажал.

кусок кода на бэкэнде:

      while Assigned(CurrNode) do
      begin
        if CurrNode.Checked then

 

Screenshot_15.jpg

Link to comment
Share on other sites

Может быть правильней это на сервере сделать с помощью рекурсии?

У меня получилось вот так:

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;

 

 

 

 

 

Link to comment
Share on other sites

1 hour ago, x11 said:

Раскрывается только первая ветвь. Вторая так и остается закрытой. Хотя, если ее раскрыть принудительно, то там узлы отмечены галочкой. Картинка 1.

Это уже другой вопрос. 

Link to comment
Share on other sites

Скажите, а планируется ли в uniGUI более менее нормальное дерево для выбора данных? Чтобы было максимально похоже на TUniTreeView. Очень на хватает этого дерева. Так же сильно, как и не хватает нормального мобильного ListView и ColorSelect 🥲

Link to comment
Share on other sites

×
×
  • Create New...