树形控件的使用和数据库的数据存取

树形控件的名称: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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值