怎样把treeview的内容保存到数据库,数据库表怎样建比较好,给出例子 怎样把treeview的内容保存到数据库,数据库表怎样建比较好,给出例子 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要想把treeview保存到数据库 前提是你的treeview最好是根据数据库动态创建 数据库的最好是ID PID类型 也就是设置父ID如果你想省力 有专门的捆绑控件 ExpressQuantumGrid中的TdxDBTreeList 你试一下 function DataSetToTreeNode(mDataSet: TDataSet; mFieldNameParent: string; //父节点标识字段名 mFieldNameTreeText: string; //节点文本字段名 mFieldNameTreeId: string; //节点标识字段名 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; // mTreeView.Items.Clear; vFieldNames := Format('%s;%s;%s', [mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]); mDataSet.Filtered := False; 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).AsString); vTreeNode.ImageIndex :=mDataSet[mFieldNameTreeId]; 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; 建议的表结构父 子 值101 10101 'abc'10101 1010101处理方法 可以考虑递归如果编码像上面那样的规律,可以不用递归 我是这样设的: ID: ParentID:父节点ID name:用来保存数据查询的FieldName level:节点层号:0、1、2、3、4.... 其它的看需要来定 一个数据库,多人同时操作的问题: sql问题??谢谢 我很菜 请教高手!!很急!!!可以另外给分!! 请教两个老问题,还请知道的做个指点吧,谢谢! 在线等待高手的解答,很着急! 本人软件发布了,进来看看吧! DBGrid控件的用法 怎样才能在DELPHI里生成EXE文件? 一个低级的问题,isnull 关于证券之星的编程(超级难题) 如何DBgrid显示出来的数据,不能修改,但可以移动滚动条显示下面的数据, 怎样通过一个非子窗体来启动一个父窗体
mFieldNameParent: string; //父节点标识字段名
mFieldNameTreeText: string; //节点文本字段名
mFieldNameTreeId: string; //节点标识字段名
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;
// mTreeView.Items.Clear;
vFieldNames := Format('%s;%s;%s',
[mFieldNameParent, mFieldNameTreeText, mFieldNameTreeId]);
mDataSet.Filtered := False;
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).AsString);
vTreeNode.ImageIndex :=mDataSet[mFieldNameTreeId];
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;
10101 1010101处理方法 可以考虑递归
如果编码像上面那样的规律,可以不用递归
ID:
ParentID:父节点ID
name:用来保存数据查询的FieldName
level:节点层号:0、1、2、3、4....
其它的看需要来定