根据表中数据动态生成菜单(三)
2008-03-01 09:28
561 查看
根据表中数据动态生成菜单(三)
本文讲述,如何通过数据库中的数据来动态生成菜单,如下:
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();
}
编译运行,就可以看到效果了,可以根据数据库中的数据来生成菜单项。
本文讲述,如何通过数据库中的数据来动态生成菜单,如下:
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();
}
编译运行,就可以看到效果了,可以根据数据库中的数据来生成菜单项。
相关文章推荐
- 根据表中数据动态生成菜单
- dwz根据json数据动态生成树
- ABAP根据输入的表名动态生成上传TXT数据的代码
- jQuery 根据JSON数据动态生成表格
- JQuery EasyUI 根据数据动态生成datagrid
- 根据一个数据表生成无限级的XML格式的菜单
- 动态SQL语句根据数据库列来查询数据,动态的生成列名称
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- 【code】flex根据数据,动态生成表格
- PHP+Mysql+easyui点击左侧tree菜单对应表名右侧动态生成datagrid加载表单数据(二)
- DotnetBar MapX中动态生成可以查询地图数据的弹出菜单问题
- 【zTree】zTree根据后台数据生成树并动态设置前面的节点复选框的选中状态
- 从数据库读取数据动态生成树形菜单示例
- 关于dorado框架datatable处的右键菜单无法根据具体数据实现动态分别显示不同菜单的解决方法
- c#从数据库读取数据动态生成树形菜单
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- 在winform中根据数据库信息动态生成菜单
- (C#)WPF根据设计的数据动态生成火车席位
- easyui根据树数据动态生成多个combobox
- React根据后台数据动态生成Form表单