//续二
void __fastcall TDBTreeView::FillChildTreeNodes(int ParentID, TTreeNode* Node, bool Nest)
{//用指定值填充子节点
TQuery* AQuery = new TQuery(this);//创建一个数据集控件
AnsiString strSql, strText;
int iID, iParentID;
int iImageIndex, iSelectedIndex;
TTreeNode* TreeNode;
TDBTreeNodeData NodeData;
//设置数据集的各项参数
AQuery->DatabaseName = ((TTable*)(FDataLink->DataSource->DataSet))->DatabaseName;//设置数据库名
AQuery->Close();//关闭数据集
AQuery->SQL->Clear();//清空原SQL语句
strSql = \"SELECT * FROM \" + ((TTable*)(FDataLink->DataSource->DataSet))->TableName + \" WHERE \";
strSql += FParentIDField + \"=:PID\";
AQuery->SQL->Add(strSql);//指定新的SQL语句
AQuery->ParamByName(\"PID\")->AsInteger = ParentID;
AQuery->Open();//打开数据集
this->Items->BeginUpdate();//开始更新DBTreeView组件显示
while (!AQuery->Eof)//未到数据集尾部
{
strText = AQuery->FieldByName(FDisplayField)->AsString;//取得显示字段内容
iID = AQuery->FieldByName(FPrimaryIDField)->AsInteger;//取得主标识字段内容
iParentID = AQuery->FieldByName(FParentIDField)->AsInteger;//取得父标识字段内容
TreeNode = this->Items->AddChild(Node, strText);//将上面取得的相关数据追加到新节点
iImageIndex = iSelectedIndex = -1;//设置节点位图与选中时位图
if (FOnSetImageIndex) FOnSetImageIndex(this, iID, iParentID, TreeNode->Level, iImageIndex, iSelectedIndex);//如果设置位图发生变化,则触发相关事件
TreeNode->ImageIndex = iImageIndex;//设置节点位图及选中时位图
TreeNode->SelectedIndex = iSelectedIndex;
NodeData.ID = iID;//取得节点主标识,父标识,并按其追加一个新节点
NodeData.ParentID = iParentID;
AddDataToNode(TreeNode, NodeData);
if (Nest) FillChildTreeNodes(iID, TreeNode);//如果指定参数Nest为true,则递归调用以填充所有子节点
AQuery->Next();//移动到下一条记录
}