您的位置:首页 > 数据库

自己写的cnCheckTreeView操作函数(数据库分级函数)测试通过(XP+D2009)

2012-07-10 08:03 253 查看
引用:CnCheckTreeView

定义:

//字符分隔符
CONST_VAL_SPLIT='■';

取值枚举:

//CnCheckTreeView组件选择结点后调用函数返回的数据类型。
type TctvResultType=(ctvResultID,ctvResultPID,ctvResultKeyField,ctvResultDisplayField,ctvResultData);

//树节点数据结构

type
pTreeNodeData=^TTreeNodeData;
TTreeNodeData=record
//节点ID
sID:String;
//父节点ID
sPID:String;
//关键字信息
sKeyField:string;
//显示字信息
sDisplayField:string;
//数据信息
sData:AnsiString;
end;

声明:

function cf_dbFillLevelCnCheckTreeView(oADOConnection:TADOConnection;oCnCheckTreeView:TCnCheckTreeView;sSql:string;sDisPlayField:string;
sKeyField:string;sIDFieldName:string;sPIDFieldName:string;bFirstClear:Boolean=True):Boolean;overload;

{获取无级Cn树点击节点的内容信息}
function cf_ctrlGetCnCheckTreeViewNodeData(oCnCheckTreeView:TCnCheckTreeView;oResultType:TctvResultType=ctvResultData):AnsiString;

实现:

//******************************************************************************
// 函数功能: 根据数据库连接/SQL查询语句及指定的显示的字段
//           ID,PID分层填充树。
// 函数名称: cf_dbFillLevelCnCheckTreeView
// 函数参数: oADOConnection:TADOConnection 数据库连接对象。
//           oCnCheckTreeView:TCnCheckTreeView; 树形控件
//           sSql:SQL查询语句
//           sDisplayField:显示的字段名
//           sIDFieldName: 唯一编号
//           sPIDFieldName: 父编号。
//           bFirstClear   是否
//   返回值: 操作是否成功
//******************************************************************************
function cf_dbFillLevelCnCheckTreeView(oADOConnection:TADOConnection;oCnCheckTreeView:TCnCheckTreeView;sSql:string;sDisPlayField:string;
sKeyField:string;sIDFieldName:string;sPIDFieldName:string;bFirstClear:Boolean=True):Boolean;overload;
var
pNodeData:pTreeNodeData;
oTreeNode,oTreeNode1,oPTreeNode,oTreeNode2:TTreeNode;
oADOQuery:TADOQuery;
oStringList:TStringList;
iFieldCount,iIndex:Integer;
begin
Result:=False;
if (oADOConnection=nil) or (oCnCheckTreeView=nil) or (Trim(sSql)='') or (Trim(oADOConnection.ConnectionString)='')
or (Trim(sDisplayField)='') or (Trim(sIDFieldName)='') or (Trim(sPIDFieldName)='') then Exit;

if bFirstClear then
begin
oCnCheckTreeView.Items.Clear;
end;

oCnCheckTreeView.BeginUpdate;
oADOQuery:=TADOQuery.Create(nil);
try
try
if oADOQuery.Active then oADOQuery.Close;
oADOQuery.SQL.Clear;
oADOQuery.Connection:=oADOConnection;
oADOQuery.SQL.Add(sSql);
oADOQuery.Open;
if not oADOQuery.IsEmpty then
begin
oStringList:=TStringList.Create;
oStringList.Clear;
oADOQuery.First;
oTreeNode:=nil;
while not oADOQuery.Eof do
begin
pNodeData:=new (pTreeNodeData);
pNodeData.sID:=oADOQuery.FieldByName(sIDFieldName).asString;
pNodeData.sPID:=oADOQuery.FieldByName(sPIDFieldName).AsString;
pNodeData.sKeyField:=oADOQuery.FieldByName(sKeyField).AsString;
pNodeData.sDisplayField:=oADOQuery.FieldByName(sDisplayField).AsString;
//所有数据列
for iFieldCount:=0 to oADOQuery.FieldCount-1 do
begin
pNodeData.sData:=pNodeData.sData + oADOQuery.Fields[iFieldCount].asString + CONST_VAL_SPLIT;
end;
oTreeNode:=oCnCheckTreeView.Items.AddObject(oTreeNode,pNodeData.sDisplayField,pNodeData);
oStringList.AddObject(AnsiString(Trim(pNodeData.sID)),oTreeNode);
oADOQuery.Next;
end;

//重置
oTreeNode1:=oCnCheckTreeView.Items.GetFirstNode;
while (oTreeNode1<>nil) do
begin
//当前节点父ID与查找的节点ID相同。
iIndex:=oStringList.IndexOf(AnsiString(Trim(pTreeNodeData(oTreeNode1.Data).sPID)));
if iIndex<>-1 then
begin
//保存点
oTreeNode2:=oTreeNode1;
//父节点。
oPTreeNode:=TTreeNode(oStringList.Objects[iIndex]);
//循环下一个节点。
oTreeNode1:=oTreeNode1.getNextSibling;
//移动
oTreeNode2.MoveTo(oPTreeNode,naAddChild);
end else begin
//循环下一个节点。
oTreeNode1:=oTreeNode1.getNextSibling;
Continue;
end;
iIndex:=-1;
end;

end;
Result:=True;
except
Result:=False;
end;
finally
oADOQuery.Free;
oCnCheckTreeView.EndUpdate;
end;
end;

//******************************************************************************
// 函数功能: 获取无级树选择节点的数据信息
// 函数名称: cf_ctrlGetCnCheckTreeViewNodeData
// 函数参数: oCnCheckTreeView:TCnCheckTreeView   树控件
//           oResultType:TctvResultType      返回操作信息的类型 /默认是所有数据。
//   返回值: 返回操作的信息
//******************************************************************************
function cf_ctrlGetCnCheckTreeViewNodeData(oCnCheckTreeView:TCnCheckTreeView;oResultType:TctvResultType=ctvResultData):AnsiString;
begin
Result:='';
if (oCnCheckTreeView=nil) or (oCnCheckTreeView.Selected=nil) then Exit;
try
if oCnCheckTreeView.Selected<>nil then
begin
case oResultType of
ctvResultID:begin
Result:=pTreeNodeData(oCnCheckTreeView.Selected.Data).sID;
end;
ctvResultPID:begin
Result:=pTreeNodeData(oCnCheckTreeView.Selected.Data).sPID;
end;
ctvResultKeyField:begin
Result:=pTreeNodeData(oCnCheckTreeView.Selected.Data).sKeyField;
end;
ctvResultDisplayField:begin
Result:=pTreeNodeData(oCnCheckTreeView.Selected.Data).sDisplayField;
end;
ctvResultData:begin
Result:=pTreeNodeData(oCnCheckTreeView.Selected.Data).sData;
end;
end;
end;
except
Result:='';
end;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: