我想要解决的问题描述如下:
    我的树型控件是来连接数据库的,我已经在树型控件中加载了节点,根节点是服务器,下一级节点是数据库,再下一级是数据表,因为每一级是不同的类型,我想通过选择某个节点后,就可以判断它是哪中类型,从而能根据不同的类型对数据库进行不同的操作?希望大家能给个帮助?先谢谢了

解决方案 »

  1.   

    谢谢你的回答!
    我已经设计了类(PgServer, PgDatabase)
    但是如果点击了那个数据库的节点,怎么关联上那个PgDatabase数据类?
    因为可能有几个数据库的节点,所以你还要判断究竟是哪个PgDatabase实例?
      

  2.   

    SetItemData,在节点中保存需要的信息。
      

  3.   

    定义枚举变量:
    0:服务器
    1:数据库
    2:表格
    3:视图
    ......
    SetItemData(hRoot, 0);//表示服务器
    if (GetItemData(hItem) == 0)
    {
        //对服务器操作
    }
      

  4.   

    在数据类中保存相应的hItem。如果你仅仅是想知道什么是数据库,什么是表的话,用SetItemData就可以了。不过我想,你可能还是需要做一些其它的事的。
    在数据类中再添加一些相应的方法。点击hItem的时候,传进去,得到相应的信息。比如是不是数据库,数据库的名字是什么,表名是什么。这样就可以做扩展了。
      

  5.   

    TV_INSERTSTRUCT TreeCtrlItem;
    TreeCtrlItem.hInsertAfter=TVI_LAST;
    TreeCtrlItem.item.mask=TVIF_TEXT|TVIF_PARAM;
    TreeCtrlItem.hParent=TVI_ROOT;
    TreeCtrlItem.item.pszText=L"sdfsdfdf";
    TreeCtrlItem.item.lParam=0; m_trcLayer.InsertItem(&TreeCtrlItem);
    充分利用好item的lParam,这是一个DWORD型的数字,你可以放一个指针吗!?
      

  6.   

    谢谢大家给的答案,很有参考价值,我基本上理解了各位大侠的意思。但是lParam参数好像不能加入指针!下面是我的部分代码:相关说明如下:
    //CPgServer和CPgDatabase 都派生于CPgObject,type 用来说明pgObject的类型
    //PGresult PGconn 是数据库中一些内部的东西,不用管  
    void CPgTreeCtrl::SetBindData(HTREEITEM hItem, int type, CPgObject *pgObject)
    {
    PGresult *res;              
    PGconn *conn;
    string sql;
    int i;
    char *result;
    HTREEITEM h1,h2; TV_INSERTSTRUCT tvinsert; tvinsert.hInsertAfter=TVI_LAST;
    tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;
    tvinsert.item.hItem=NULL;
    tvinsert.item.cchTextMax=6;
    tvinsert.item.cChildren=0;
    tvinsert.item.lParam=0; switch(type)
    {
    case 0:
    sql = "select datname from pg_database where datname not in ('template1','template0','template_postgis')";

    conn = pgObject->GetConn();
    // conn = PQconnectdb("host=127.0.0.1 user=postgres password=postgres");
    res = PQexec(conn, sql.data()); for(i = 0; i < PQntuples(res); i++)
    {
    result = PQgetvalue(res, i, 0);
    tvinsert.hParent = hItem;
    tvinsert.item.iImage = 1;
    tvinsert.item.iSelectedImage=1;
    tvinsert.item.pszText = result;
    h1 = InsertItem(&tvinsert);// SetItemData(h1, pgObject);     //出错
    CPgDatabase database(pgObject->m_host,pgObject->m_username,pgObject->m_pwd,result);
    if(!database.PGCreateConn())
    {
    return;
    }
    SetBindData(h1, 1, &database);
    }
    break;
    case 1:
    tvinsert.hParent = hItem;
    tvinsert.item.iImage = 2;
    tvinsert.item.iSelectedImage=2;
    tvinsert.item.pszText = "public";
    h2= InsertItem(&tvinsert);

    sql = "select tablename from pg_tables where schemaname = 'public' and tablename not in('geometry_columns','spatial_ref_sys')"; conn = pgObject->GetConn();
    res = PQexec(conn, sql.data()); for(i = 0; i < PQntuples(res); i++)
    {

    result = PQgetvalue(res, i, 0);
    tvinsert.hParent = h2;
    tvinsert.item.iImage = 3;
    tvinsert.item.iSelectedImage=3;
    tvinsert.item.pszText = result;
    InsertItem(&tvinsert); }
    break;
    default:
    break;
    }}按照大家的意思,我只能取得它的类型,但是不能判断究竟是哪个实例.例如,我有postgres和gisdb两个数据库,都加到了节点里面,并且数据库都连接上了。如果我点击postgres节点,我就要取得跟这个节点相关的CPgDatabase实例,接着它就可以操作连接的postgres数据库了!
    请问各位大侠该怎么办?
    谢谢大家的帮助!
      

  7.   

    SetItemData(h1, pgObject);   -----------> SetItemData(h1,(LPARAM)pgObject);     然后用 GetItemData(hItem) 获取就可以了。