1、新建一个Dialog MFC项目 不需要数据库支持
2、将dialog界面设置为👇,list control添加变量为m_lst
3、双击这个新建的按钮,在xxxDialog.cpp中插入以下内容
#include<afxdb.h>
#include<odbcinst.h>
#pragma comment (lib,"odbccp32.lib") //SQL driver
在onbuttonclick函数中插入以下内容
// TODO: Add your control notification handler code here
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
CRecordset resset(&database);//recordset:表
sSql="SELECT 学号,姓名,手机号,学院 From List";
resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
while(!resset.IsEOF())
{
resset.GetFieldValue(_T("学号"),str1);
resset.GetFieldValue(_T("姓名"),str2);
resset.GetFieldValue(_T("手机号"),str3);
resset.GetFieldValue(_T("学院"),str4);
m_lst.InsertItem(i,_T(""));
m_lst.SetItemText(i,0,str1);
m_lst.SetItemText(i,1,str2);
m_lst.SetItemText(i,2,str3);m_lst.SetItemText(i,3,str4);
resset.MoveNext();
i++;
}
database.Close();
UpdateData();
在OnInitDialog()中添加如下代码:
m_lst.ModifyStyle(0L,LVS_SHOWSELALWAYS);
DWORD dwStyle = m_lst.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的list control)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_lst.SetExtendedStyle(dwStyle);
m_lst.InsertColumn(0,_T("学号"),LVCFMT_CENTER,150);
m_lst.InsertColumn(1,_T("姓名"),LVCFMT_CENTER,150);
m_lst.InsertColumn(2,_T("手机号"),LVCFMT_CENTER,150);
m_lst.InsertColumn(3,_T("学院"),LVCFMT_CENTER,150);
对ListControl进行初始化。
4、插入combo box和list
class wizard添加变量m_Combo m_lst2
OnInitDialog添加
m_Combo.AddString(_T("信息院"));
m_Combo.AddString(_T("林学院"));
m_Combo.AddString(_T("机电院"));
m_Combo.SetCurSel(0);//默认显示第一个
把combo的sort属性改为False
5、给Combo添加响应事件。
void CNoDSNDlg::OnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
CString str;
m_Combo.GetLBText(m_Combo.GetCurSel(),str);
int num = m_lst2.GetCount();
for(int i=num;i>=0;i--)
m_lst2.DeleteString(i);
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
CRecordset resset(&database);//recordset:表
sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 学院=";
sSql = sSql + _T("'") + str + _T("'");//引号非常重要
//MessageBox(sSql);
resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
while(!resset.IsEOF())
{
resset.GetFieldValue(_T("学号"),str1);
resset.GetFieldValue(_T("姓名"),str2);
resset.GetFieldValue(_T("手机号"),str3);
resset.GetFieldValue(_T("学院"),str4);
CString sstr;
sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
m_lst2.AddString(sstr);
resset.MoveNext();
}
database.Close();
UpdateData();
}
6、把listbox的sort属性也改为false
以上,基本完成了数据库根据学院的查询操作。
接下来,如何将左边、右边两个list控件进行级联?目标为双击左边控件里的内容,在右边的控件进行详细展示。(略,输入到str作为中介CString str;m_lst2.GetText(m_lst2.GetCurSel(),str);)
7、增加删除右表所有数据的功能
void CNoDSNDlg::OnClickedButton4()
{
// TODO: Add your control notification handler code here
m_lst.DeleteAllItems();
}
或者
void CNoDSNDlg::OnClickedButton4()
{
// TODO: Add your control notification handler code here
//每次都删第一行
int num = m_lst.GetItemCount();
for(int i=0;i<num;i++)
m_lst.DeleteItem(0);
}
void CNoDSNDlg::OnClickedButton4()
{
// 或者每次都删除列
while(m_lst.DeleteColumn(0));
}
8、重要的
按照手机号查找:新建edit box 赋给value型变量 m_FindPhone
双击按钮添加函数
void CNoDSNDlg::OnClickedButton3()
{
// TODO: Add your control notification handler code here
CString Phone;
Phone = m_FindPhone;
int num = m_lst2.GetCount();
for(int i=num;i>=0;i--)
m_lst2.DeleteString(i);
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
CRecordset resset(&database);//recordset:表
sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 手机号 like ";
sSql = sSql + _T("'%%") + Phone + _T("%%'");//引号非常重要
resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
while(!resset.IsEOF())
{
resset.GetFieldValue(_T("学号"),str1);
resset.GetFieldValue(_T("姓名"),str2);
resset.GetFieldValue(_T("手机号"),str3);
resset.GetFieldValue(_T("学院"),str4);
CString sstr;
sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
m_lst2.AddString(sstr);
resset.MoveNext();
}
database.Close();
UpdateData();
}
按照姓名查找:控件,m_FindName,代码
void CNoDSNDlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
CString Name;
Name = m_FindName;
int num = m_lst2.GetCount();
for(int i=num;i>=0;i--)
m_lst2.DeleteString(i);
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
CRecordset resset(&database);//recordset:表
sSql="SELECT 学号,姓名,手机号,学院 From list WHERE 姓名 like ";
sSql = sSql + _T("'%%") + Name + _T("%%'");//引号非常重要
resset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);
while(!resset.IsEOF())
{
resset.GetFieldValue(_T("学号"),str1);
resset.GetFieldValue(_T("姓名"),str2);
resset.GetFieldValue(_T("手机号"),str3);
resset.GetFieldValue(_T("学院"),str4);
CString sstr;
sstr = str1 +' ' + str2 +' ' + str3 +' ' + str4;
m_lst2.AddString(sstr);
resset.MoveNext();
}
database.Close();
UpdateData();
}
增加新数据:新建一个Dialog,见上次的记录。
参考了以下链接:
https://www.cnblogs.com/jcss2008/archive/2009/01/20/1379060.html
https://blog.csdn.net/weixin_30681615/article/details/97710118
void CNoDSNDlg::OnBnClickedButton6()
{
// TODO: Add your control notification handler code here
CAddRecord addRec;
addRec.DoModal();
CString Name, Sno,Phone,Depart;
Sno = addRec.AddSno;
Name = addRec.AddName;
Phone = addRec.AddPhone;
Depart = addRec.AddDepart;
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
//CRecordset resset(&database);//recordset:表
sSql="INSERT INTO list([学号],[姓名],[手机号],[学院]) VALUES('";//"INSERT INTO list(学号,姓名,手机号,学院) VALUES('"
sSql = sSql + Sno + _T("','") + Name + _T("','") + Phone + _T("','") + Depart + _T("')");
//MessageBox(sSql);
//resset.Open(CRecordset::forwardOnly,sSql,CRecordset::appendOnly);
if(Sno != "")
database.ExecuteSQL(sSql);
database.Close();
}
选中List Control中的行,从数据库删除数据:
void CNoDSNDlg::OnBnClickedButton5()
{
// TODO: Add your control notification handler code here
POSITION p = m_lst.GetFirstSelectedItemPosition();
if (p == NULL)
{
MessageBox(_T("没有行被选中!"));
return;
}
int index = m_lst.GetNextSelectedItem(p);
CString Sno;
Sno = m_lst.GetItemText(index,0);
//MessageBox(strValue);
CDatabase database;
CString sSql;
CString str1,str2,str3,str4;
CString sDriver;
CString sDsn;
CString sFile = _T("4col.mdb");
int i=0;
sDriver = _T("Microsoft Access Driver (*.mdb)");
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='''';DBQ=%s"),sDriver,sFile);
database.Open(NULL,false,false,sDsn);//database: 库
//CRecordset resset(&database);//recordset:表
sSql = "DELETE FROM list WHERE 学号=";
sSql = sSql + _T("'") + Sno + _T("'");
//MessageBox(sSql);
database.ExecuteSQL(sSql);
database.Close();
m_lst.DeleteItem(index);
}
▲▲▲对查询手机号、姓名的窗口添加 EN_CHANGE函数,加入UpdateData();//这样才能实时获得输入内容!!!
PS:添加登录界面:见下一次记录。