树形控件的名称:Tree Control
m_tree.ModifyStyle(NULL, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
通过在初始化的过程中完成对树形控件外观(具有按钮,具有线,root具有线)的配置
初始化数据库
int CUserManageDlg::InitDatabase()
{
// TODO: 在此处添加实现代码.
if (0 == mysql_library_init(0, NULL, NULL))
{
//AfxMessageBox(_T("MYSQL LIB初始化成功"));
}
else
{
//AfxMessageBox(_T("MYSQL LIB初始化失败"));
return -1;
}
//初始化MYSQL数据结构
if (NULL != mysql_init(&mydata))//mydata是在程序开始时声明的数据库的句柄(指针)
{
//AfxMessageBox(_T("数据结构初始化成功"));
}
else
{
//AfxMessageBox(_T("数据结构初始化失败......."));
return -2;
}
//在连接数据库之前设置必要的连接属性,在这里设置字符集为GBK,否者不能识别中文?
if (0 == mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "gbk"))
{
//AfxMessageBox(_T("字符集设置成功......."));
}
else
{
//AfxMessageBox(_T("字符集设置失败........"));
return -3;
}
// 127.0.0.1 1 2 3 4 5 6 8
//连接数据库,本例程连接了系统默认的数据库mysql,如果已经生成了自己的数据库,就可以修改字节的书库
//Mysql服务器地址 用户名 密码 数据库名 端口号
if (NULL != mysql_real_connect(&mydata, "localhost", "root", "*****", "mjsdata", 3306, NULL, 0))
{
//AfxMessageBox(_T("数据库连接成功......"));
return 0;
}
else
{
//AfxMessageBox(_T("数据库连接失败......"));
return -4;
}
//return 0;
}
在数据库内添加一个节点,并且存入数据库
void CUserManageDlg::OnBnClickedButtonAddDept()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int id = GetDeptID(m_deptname);//后续程序说明
if (id >= 0)
{
AfxMessageBox("该部门名称已经存在,请重新命名!");//弹出窗口,该部门已经存在
return;
}
HTREEITEM hItemRoot = m_tree.GetRootItem();//节点的数据类型 HTREEITEM
//在整个控件变量里查找根
if (hItemRoot == NULL)//如果没有根节点,插入根节点
{
hItemRoot = m_tree.InsertItem(m_deptname, TVI_ROOT, TVI_LAST);
//TVI_ROOT是指插入根节点,TVI_LAST是指插入到同级当中的最后一个
m_tree.SelectItem(hItemRoot);//让该节点获得焦点
InsertDeptToDatabase(m_deptname, 0);//把根节点插入数据库
}
else
{
HTREEITEM hSelectedItem = m_tree.GetSelectedItem();//获取当前选择的节点
if (hSelectedItem != NULL)//如果没有根节点,插入根节点
{
m_tree.InsertItem(m_deptname, hSelectedItem, TVI_LAST);
m_tree.Expand(hSelectedItem, TVE_EXPAND);//展开当前节点
CString pDeptName = m_tree.GetItemText(hSelectedItem);
int pid = GetDeptID(pDeptName);//查找当前节点的pid,及时焦点的id
InsertDeptToDatabase(m_deptname, pid);//把根节点插入数据库,并保存pid
}
}
}
//InsertDeptToDatabase函数的补全
int CUserManageDlg::InsertDeptToDatabase(CString strDeptName, int pID)
{
// TODO: 在此处添加实现代码.
//UpdateData(TRUE);
if (strDeptName == "")//没有传入数据,直接结束
return -1;
CString strSQL;
strSQL.Format("INSERT INTO dept(pid,deptname) VALUES (%d,'%s')", pID, strDeptName);
if (0 == mysql_query(&mydata, strSQL))
{
AfxMessageBox(_T("插入数据成功......."));
}
else
{
AfxMessageBox(_T("插入数据失败......."));
return -2;
}
return 0;
}
//GetDeptID的函数补全
//通过已知的部门名称,完成对部门id的查找
int CUserManageDlg::GetDeptID(CString strDeptName)
{
// TODO: 在此处添加实现代码.
CString strSQL;
strSQL.Format("SELECT * FROM dept where deptname='%s'",strDeptName);//查找部门的sql语句
MYSQL_RES *result = NULL;//定义了结果集的指针(相当于二位数组)
if (0 == mysql_query(&mydata, strSQL))
{
//AfxMessageBox("获取数据成功.......");
//一次性取得数据集
result = mysql_store_result(&mydata);//把select语句执行的结果存储到result里
//取得并打印行数
int rowcount = mysql_num_rows(result);//获得有多少符合条件的记录
if (rowcount == 0)//没有找到指定名字的部门
{
return -1;
}
//打印各行
MYSQL_ROW row = NULL;
row = mysql_fetch_row(result);//获取第一条记录
if (row == NULL)//获取内容失败
{
return -2;
}
int id;
id = atoi(row[0]);
return id;
}
else
{
return -3;
}
}
完成对数据的替换
void CUserManageDlg::OnBnClickedButtonModifyDept()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hSelectedItem = m_tree.GetSelectedItem();//获取当前选择的节点
if (hSelectedItem != NULL)//如果没有选择,不执行该操作
{
UpdateData(TRUE);
CString olddeptname = m_tree.GetItemText(hSelectedItem);//或去选择节点原有名称
m_tree.SetItemText(hSelectedItem, m_deptname);//在控件上完成替换,但是没有替换数据库中的数据
CString strSQL;
strSQL.Format ( "UPDATE dept SET deptname = '%s' where deptname = '%s'",m_deptname,olddeptname);
if (0 == mysql_query(&mydata, strSQL))//执行SQL语句,完成对数据库数据的替换
{
AfxMessageBox(_T("更新数据成功......."));
}
else
{
AfxMessageBox(_T("更新数据失败......."));
}
}
}
完成对数据的删除
void CUserManageDlg::OnBnClickedButtonDeleteDept()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hSelectedItem = m_tree.GetSelectedItem();//获取当前选择的节点
if (hSelectedItem != NULL)//没有选择节点,不执行该操作
{
CString needdelete = m_tree.GetItemText(hSelectedItem);
m_tree.DeleteItem(hSelectedItem);
CString strSQL;
strSQL.Format("DELETE FROM dept where deptname = '%s'", needdelete);
if (0 == mysql_query(&mydata, strSQL))
{
AfxMessageBox(_T("删除数据成功......."));
}
else
{
AfxMessageBox(_T("删除数据失败......."));
}
}
}
显示数据的处理
int CUserManageDlg::LoadDatabase()
{
// TODO: 在此处添加实现代码.
CString strSQL;
strSQL = "SELECT * FROM dept";//从这个表中进行查询
MYSQL_RES *result = NULL;//二维数组的指针
if (0 == mysql_query(&mydata, strSQL))
{
//AfxMessageBox("获取数据成功.......");
//一次性取得数据集
result = mysql_store_result(&mydata);//存储结果再result里
//取得并打印行数
int rowcount = mysql_num_rows(result);
if (rowcount == 0)//没有部门
{
return -1;
}
//打印各行
MYSQL_ROW row = NULL;//行指针
row = mysql_fetch_row(result);//获取了二维数组的第一行
int id;
int pid;
CString deptname;
map<int, HTREEITEM>link;//用于存储id和句柄的关系
id = atoi(row[0]);
pid = atoi(row[1]);
deptname = row[2];
HTREEITEM hItemRoot;
hItemRoot = m_tree.InsertItem(deptname, TVI_ROOT, TVI_LAST);
link[id] = hItemRoot;//存储过程
row = mysql_fetch_row(result);//获得第一行
while (row != NULL)//执行循环,逐行遍历
{
id = atoi(row[0]);
pid = atoi(row[1]);
deptname = row[2];
HTREEITEM hItem;
hItem = m_tree.InsertItem(deptname, link[pid], TVI_LAST);//利用map完成数据的插入
link[id] = hItem;//继续储存关系
row = mysql_fetch_row(result);
m_tree.Expand(link[pid], TVE_EXPAND);//完成数据的显示
}
}
else
{
return -3;
}
return 0;
}
return code;