我也是个初学者,你看看吧,
function DataSetToTreeNode(mDataSet: TDataSet;
mFieldNameParent: string; //上级ID INE_SUPERIOR_ID
mFieldNameTreeText: string; //名称 INE_NAME
mFieldNameTreeId: string; //ID INE_ID
mTreeView: TTreeView; mTreeNode: TTreeNode;
mParentText: string): Boolean;
var
vTreeNode: TTreeNode;
vFieldValues: Variant;
vFieldNames: string;
begin
Result := False;
if not Assigned(mDataSet) then Exit;
if not Assigned(mTreeView) then Exit;
if not mDataSet.Active then Exit;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
if QuotedStr(mParentText) = '' Then
mDataSet.Filter := Format('Not %s Is Null',[mFieldNameParent])
else
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
if mDataSet.RecordCount = 0 then Exit;
mDataSet.First;
while not mDataSet.Eof do begin
vTreeNode := mTreeView.Items.AddChild(mTreeNode,
mDataSet.FieldByName(mFieldNameTreeText).Value);
vFieldValues := mDataSet[vFieldNames];
DataSetToTreeNode(mDataSet, mFieldNameParent, mFieldNameTreeText,
mFieldNameTreeId, mTreeView, vTreeNode,
mDataSet.FieldByName(mFieldNameTreeId).AsString);
///////Begin 恢复位置
mDataSet.Filtered := False;
mDataSet.Filter := Format('%s=%s', [mFieldNameParent, QuotedStr(mParentText)]);
mDataSet.Filtered := True;
mDataSet.Locate(vFieldNames, vFieldValues, []);
///////End 恢复位置
mDataSet.Next;
end;
Result := True;
end;
procedure TForm9.FormShow(Sender: TObject);
var
LDir,DBPath,AppPath:String;
begin
with DataSource1.DataSet do
begin
TreeView1.Items.Clear;
DataSetToTreeNode(ADOTable1, 'INE_SUPERIOR_ID', 'INE_NAME', 'INE_ID',
TreeView1, nil, 'NULL');
ADOTable1.Filter := '';
end;
end;
procedure TForm9.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
lStr,ID : string;
begin
lStr := Node.Text;
ADOTable1.Locate('INE_Name',lStr,[loCaseInsensitive]);
FNode := Node;
end;