首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么将数据库中的数据填写到treeview中去,希望用递归做来着!

2012-02-11 
如何将数据库中的数据填写到treeview中去,希望用递归做来着!!!!!我的数据库bhlbls0大类01衣服00101上衣010

如何将数据库中的数据填写到treeview中去,希望用递归做来着!!!!!
我的数据库
bh         lb         ls  
0         大类  
01       衣服       0
0101   上衣       01
010101     小孩上衣     0101
010102     男装上衣     0101
010103     男装上衣     0101
0102   裤子       01
0103   内衣       01

用的ascess   数据库,怎么把这些内容用树显示出来,谢谢!!!!
根据ls来确定起父子关系



[解决办法]
先用adoquery去查询你的数据库,这个就不详说了
int nLs = adoquery-> Fieldbyname( "ls ")-> asinteger ;//假设你的ls是int型
然后根据nLs来判断是父结点还是子结点
我直接贴一段构造树的函数吧,这个不用递归,在树的其他操作中我才用递归.


//===========================Creator: duanchangzhi==============================
//函数名: Write2TV
//参数: TTreeView *tv:tv
// AnsiString strSql:要查询的sql语句
// AnsiString strBaseNode :根节点的名称
// AnsiString strKeyField :关键字段,根据这个字段来区分是大部位(大模块)还是小部位(小功能模块)
// AnsiString strBigName :大的name,比如是大部位的字段名,和大模块的模块名
// AnsiString strSmallName :小的.小部位的name和小模块的name
//返回: void
//功能: 从数据库中把记录写到TreeView上.
//调用者: 基础表pagecontrol-> change事件
//创建者: 段昌志
//日期: 20070122
//备注: 这里的sql查询语句中不能使用order by sn,因为使用的话就在树形结构中排序的不合适.
// 但是这个SN可以在登记界面中使用,因为那里不是树形结构.
//修改记录: 1.0126
// 2.0213让根节点显示文件夹图标,rNode-> ImageIndex = 3 ;
// 3.0213添加了4个参数:tv,strSql ,strBaseNode,strKeyField
// 4.修改了树的根结点的图标,原来是2,现在改为3,2改为部分选中的图标
//==============================================================================
void __fastcall SysComm::Write2TV( TTreeView *tv , AnsiString strSql ,AnsiString strBaseNode ,
AnsiString strKeyField ,AnsiString strBigName ,AnsiString strSmallName )
{
try
{


//
qry-> Close() ;
qry-> SQL-> Text = strSql ;
qry-> Open() ;
//
TTreeNode *rNode ,*mNode ;
tv-> Items-> Clear() ;
//在树中插入一个总的根节点
rNode = tv-> Items-> Add(tv-> Selected,strBaseNode ) ;//先插入一个根节点
//让跟节点显示 "文件夹 "图标
rNode-> ImageIndex = 3 ;
rNode-> SelectedIndex = 3 ;
//
bool bFirst = true ;//是否是第一次执行插入节点,
//
qry-> First() ;
while ( !qry-> Eof )
{
//nIsBig :表示这条记录是大部位还是小部位,或者是大模块还是小功能模块
int nIsBig = qry-> FieldByName( strKeyField )-> AsInteger ;
if (nIsBig == 1 )// ==1 大部位,
{
if ( !bFirst )//不是第一次插入时,当是第二次等插入时,走到这一步肯定是大部位,所以要返回到大部位的那级
{
rNode = rNode-> Parent ;
}
//
AnsiString strName = qry-> FieldByName( strBigName )-> AsString.Trim() ;
rNode = tv-> Items-> AddChild( rNode , strName ) ;
//image
rNode-> ImageIndex = 0;
rNode-> SelectedIndex = 1;
//在第一次之后后把bFirst = false ,
bFirst = false ;
}
else if(nIsBig == 0) //小部位
{
AnsiString strName = qry-> FieldByName( strSmallName )-> AsString.Trim() ;
mNode = tv-> Items-> AddChild( rNode , strName ) ;
//image
mNode-> ImageIndex = 0;


mNode-> SelectedIndex = 1;
}
//
qry-> Next() ;
}
tv-> FullExpand() ;
}
catch(Exception &E)
{........
}

热点排行