Цитата: inigo
Цитата:Насколько удалось самостоятельно разобраться, "чекать" дочерние и родительские узлы приходиться самому. Написал две процедурки: одна рекурсивная для "детей" и одна обычная для "родителей".
поделись с народом, может кому пригодится, у меня одно время тоже была подобная заморочка, потом переделал интерфейс и проблема отпала
Имеем:
tlData: TcxTreeList;
Первая колонка:
Properties = CheckBox
AllowGrayed = True
Обработчик события для tlData OnEditValueChanged:
procedure TForm1.tlDataEditValueChanged(Sender: TObject;
AColumn: TcxTreeListColumn);
var
tnNode: TcxTreeListNode; // Редактируемый узел
begin
inherited;
if (AColumn.ItemIndex <> 0) then Exit;
tnNode := tlData.FocusedNode;
tnNode.EndEdit(false);
if (tnNode.Values[0] = null) then
tnNode.Values[0] := true;
tnNode.EndEdit(false);
// Установить значения для дочерних узлов
nSetChildNodeState(tnNode);
// Установить значения для родительских узлов
nSetParentNodeState(tnNode);
end;
procedure TForm1.nSetChildNodeState(tnNode_: TcxTreeListNode);
var
tnChild: TcxTreeListNode; // Дочерний узел
begin
// Установить значения для дочерних узлов
tnChild := tnNode_.GetFirstChild();
while Assigned(tnChild) do begin
tnChild.Values[0] := tnNode_.Values[0];
tnChild.EndEdit(false);
nSetChildNodeState(tnChild);
tnChild := tnNode_.GetNextChild(tnChild);
end; // while
end;
procedure TForm1.nSetParentNodeState(tnNode_: TcxTreeListNode);
var
tnParent: TcxTreeListNode; // Родительский узел
tnChild: TcxTreeListNode; // Дочерний узел
iTrue: integer; // Количество помеченных дочерних узлов
iFalse: integer; // Количество непомеченных дочерних узлов
begin
// Установить значения для родительских узлов
tnParent := tnNode_.Parent;
while Assigned(tnParent) do begin
iTrue := 0;
iFalse := 0;
tnChild := tnParent.GetFirstChild;
while Assigned(tnChild) do begin
if (tnChild.Values[0] = true) then Inc(iTrue);
if (tnChild.Values[0] = false) then Inc(iFalse);
tnChild := tnParent.GetNextChild(tnChild);
end; // while
if (tnParent.Count = iTrue) then
tnParent.Values[0] := true
else
if (tnParent.Count = iFalse) then
tnParent.Values[0] := false
else
tnParent.Values[0] := null;
tnParent := tnParent.Parent;
end; // while
end;