根據表中數據動態生成菜單
根據表中數據動態生成菜單
本文講述,如何通過數據庫中的數據來動態生成菜單,如下:
1.創建對話框工程:DynamicMenuBornFromDatabase
2.本文使用ADO技術,因此需要導入一個ADO動態鏈接庫msado15.dll,此庫位於”
Program Files/Common Files/System/ado/”。StdAfx.h中代碼如下:
#import
"c:/Program Files/Common Files/System/ado/msado15.dll"
rename_namespace ("ADODB")/
rename ("EOF","ADOEOF")
usingnamespaceADODB ;
如果你的系統盤是其它盤,只需要修改以上路徑即可。
3.爲InitInstance()函數添加初始化連接數據庫操作如下:
//添加數據庫連接
AfxOleInit();
m_pCon.CreateInstance(__uuidof(Connection));
m_pRecord.CreateInstance(__uuidof(Recordset));
m_pCon->ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0; /
Data Source=./Menu.mdb;Persist Security Info=False";
try
{
m_pCon->Open("","","",-1);
}
catch(...)
{
AfxMessageBox("數據庫連接錯誤",0,0);
exit;
}
4.在CDynamicMenuBornFromDatabaseDlg類中添加如下成員變量:
CMenu menu;
HMENU h_menu ;
HMENU h_submenu;
CDynamicMenuBornFromDatabaseDlg實現中添加如下兩個變量:
extern _ConnectionPtr m_pCon;
extern _RecordsetPtr m_pRecord;
添加兩個全局變量如下:
_ConnectionPtr m_pCon;
_RecordsetPtr m_pRecord;
在OnInitDialog()中添加如下代碼:
menu.CreateMenu();
LoadMenuFromDatabase();
5.在CDynamicMenuBornFromDatabaseDlg中添加如下三個成員函數如下:
//判斷指定的菜單是否有子菜單項
BOOL CDynamicMenuBornFromDatabaseDlg::IsHaveSubMenu(CString str)
{
_ConnectionPtr m_con;
_RecordsetPtr m_record;
m_con.CreateInstance("ADODB.Connection");
m_record.CreateInstance("ADODB.Recordset");
m_con->ConnectionString = m_pCon->ConnectionString;
m_con->Open("","","",-1);
CString sql;
sql.Format("select * from tb_menuinfo where
上級菜單 = '%s'",str);
m_record = m_con->Execute((_bstr_t)sql,NULL,adCmdText);
if ((!m_record->BOF) &&(! m_record->ADOEOF))
{
return TRUE;
}
return FALSE;
}
//從數據庫中加載菜單
void CDynamicMenuBornFromDatabaseDlg::LoadMenuFromDatabase()
{
CString sql;
sql.Format( "select * from tb_menuinfo where
上級菜單 is NULL");
m_pRecord = m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);
CMenu m_menu;
CString c_menustr;
while (! m_pRecord->ADOEOF)
{
c_menustr = m_pRecord->GetCollect("菜單名稱").bstrVal;
//menu.AppendMenu(MF_STRING,-1,c_menustr);
LoadSubMenu(&menu,c_menustr);
m_pRecord->MoveNext();
}
SetMenu(&menu);
}
//利用遞歸的方式加載子菜單
void CDynamicMenuBornFromDatabaseDlg::LoadSubMenu(CMenu *m_menu, CString str)
{
_ConnectionPtr m_con;
_RecordsetPtr m_record;
m_con.CreateInstance("ADODB.Connection");
m_record.CreateInstance("ADODB.Recordset");
m_con->ConnectionString = m_pCon->ConnectionString;
m_con->Open("","","",-1);
CString sql;
sql.Format("select * from tb_menuinfo where
上級菜單 = '%s'",str);
m_record = m_con->Execute((_bstr_t)sql,NULL,adCmdText);
CMenu m_tempmenu;
m_tempmenu.CreatePopupMenu();
while (!m_record->ADOEOF)
{
CString c_menustr = m_record->GetCollect("菜單名稱").bstrVal;
m_tempmenu.AppendMenu(MF_STRING,-1,c_menustr);
if (IsHaveSubMenu(c_menustr))
LoadSubMenu(&m_tempmenu,c_menustr);
m_record->MoveNext();
}
m_menu->AppendMenu(MF_POPUP,(UINT)m_tempmenu.m_hMenu,str);
m_tempmenu.Detach();
if (m_record != NULL)
m_record.Release();
if (m_con!= NULL)
m_con.Release();
}
編譯運行,就可以看到效果了,可以根據數據庫中的數據來生成菜單項。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.