之前总结的遗漏部分,发现用的还挺频繁,粘在这里方便参考,格式很不严谨,大家看也勿抠代码,会意为主。
1.列表控件删除记录
int nCurSel =m_xiugai_list.GetNextItem(-1,LVNI_SELECTED);//m_xiugai_list是我设置的列表控件对应的变量
1.列表控件删除记录
int nCurSel =m_xiugai_list.GetNextItem(-1,LVNI_SELECTED);//m_xiugai_list是我设置的列表控件对应的变量
if(nCurSel == -1 )
{
MessageBox("没有选择修改数据!");
return ;
}
int nSelRows = m_xiugai_list.GetSelectedCount(); //被选择的项的数目
if(!nSelRows) //-- If there are no rows selected,jump out here
return;
POSITION pos =m_xiugai_list.GetFirstSelectedItemPosition(); //返回一个用于迭代或获取对象指针的POSITION值;如果没有选择任何项,那么将返回NULL。
int i = m_xiugai_list.GetNextSelectedItem(pos); //返回列表视图控件中被选择的下一项的索引值
CString sql = "select * from m_dadj ";//m_dadj为数据库中的数据表(连接数据库之前已经总结了,这里不赘述了)
m_ado.m_pRecordset = m_ado.OpenRecordset(sql);
//打开记录集
int nCount = m_ado.m_pRecordset->RecordCount;
//利用成员RecordCount取得记录数
::CoInitialize(NULL);
m_ado.m_pRecordset->Move(i);
m_ado.m_pRecordset->Delete(adAffectCurrent);
AfxMessageBox(TEXT("记录已成功删除!!"));
2.链接access数据库驱动代码
3.数据库模糊查询
CString sql = "select * from book where bookname like '%"+m_name+"%'";//m_name为CString变量
4.结点构造
5.读取txt数据生成链表
Login *p,*q;//指向Login结构的指针
2.链接access数据库驱动代码
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\
uid=;pwd=;DBQ=book_db.mdb;";//book_db.mdb为我的数据库文件
m_pConnection->Open(strConnect,"","",adModeUnknown);
_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\
uid=;pwd=;DBQ=book_db.mdb;";//book_db.mdb为我的数据库文件
m_pConnection->Open(strConnect,"","",adModeUnknown);
3.数据库模糊查询
CString sql = "select * from book where bookname like '%"+m_name+"%'";//m_name为CString变量
4.结点构造
typedef struct Login //我们之前的一个结点结构,完全是会意结构用
{
char TAXI_ID[20];
char TAXI_Pwd[20];
int USER_ID;
struct Login *next;
}Login;
5.读取txt数据生成链表
Login *p,*q;//指向Login结构的指针
FILE *fp;
fp=fopen("用户名.txt","r+");
if(fp==NULL)
{
AfxMessageBox("不能打开此文件!");
exit(0);
}
p=(Login *)malloc(sizeof(Login));//指向新的Login结点
head=p;//head头结点
q=p;
while(!feof(fp))
{
p=(Login *)malloc(sizeof(Login));
q->next=p;
q=p;
fscanf(fp,"%s %s %d",p->TAXI_ID,p->TAXI_Pwd,&(p->USER_ID));//在文件中按指定格式读取数据
}
q->next=NULL;
fclose(fp);
6.将数据写入txt并更新链表
7.时间控件使用(Date Time Control,,数据类型CDateTimeCtrl)
8.列表控件排序
6.将数据写入txt并更新链表
FILE *fp=fopen("司机信息.txt","a+");
if (fp==NULL)
{
AfxMessageBox("不能打开此文件!");
exit(0);
}
char str[50];
int tt=0;
char ssex[20];
if(m_sex==0)
strcpy(ssex,"男");
else
strcpy(ssex,"女");
sprintf(str,"%s %s %s %s %s %d",m_carnumber,m_name,ssex,m_cartype,m_loginname,tt);//将多个数据变量按格式写成字符串,以便写入文件
fputc('\n',fp);
if(fputs(str,fp)!=EOF)//如果写入数据成功
{//更新链表结构
Taxidriver *temp,*xin;
temp=drive;
while(temp->next!=NULL)
temp=temp->next;
xin=(Taxidriver *)malloc(sizeof(Taxidriver));
strcpy(xin->TAXI_MEMEBER,m_carnumber);
strcpy(xin->DRIVER_NAME,m_name);
strcpy(xin->DRIVER_SEX,ssex);
strcpy(xin->TAXI_STYLE,m_cartype);
strcpy(xin->TAXI_ID,m_loginname);
xin->state=tt;
temp->next=xin;
}
fclose(fp);
7.时间控件使用(Date Time Control,,数据类型CDateTimeCtrl)
CTime time;
m_date1.GetTime(time);//两个时间控件分别对应m_date1、m_date2,表示一个时间周期
CString strTime1=time.Format("%Y-%m-%d"); //获取日期
m_date2.GetTime(time);
CString strTime2=time.Format("%Y-%m-%d"); //获取日期
if(strTime1>strTime2)
{
AfxMessageBox("日期区间输入有误!");
return;
}
char m_time1[20],m_time2[20],m_nname[20];//转换数据格式
strncpy(m_time1,(LPCTSTR)strTime1,sizeof(m_time1));
strncpy(m_time2,(LPCTSTR)strTime2,sizeof(m_time2));
为CSortListCtrl类添加以下成员变量:
BOOL m_fAsc; //用来设置是升序排列还是降序排列
int m_nSortedCol; //用来记录被点击的是哪一列
在CSortListCtrl类的构造函数中添加m_fAsc=TRUE;把排序初始化为按升序排序
当列标题被点击的时候,会促发LVN_COLUMNCLICK消息,因此对CSortListCtrl类的LVN_COLUMNCLICK消息进行消息响应,进行排序操作。
消息响应函数如下:
void CDRIVER::OnLvnColumnclickList2(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: 在此添加控件通知处理程序代码
for (int index=0;index<m_driverlist.GetItemCount();index++)
m_driverlist.SetItemData(index,index);
//SetItemData函数的作用是为一行设置一个标签,以后通过该标签就能找回这一行,标签是一个数值。SetItemData(index,index)意思就是这一行是第几列就把标签设为几。为什么要设置标签呢?以后的排序必须用到标签。
if(pNMListView->iSubItem!=0&&pNMListView->iSubItem!=4&&pNMListView->iSubItem!=1)
return;
if( pNMListView->iSubItem == m_nSortedCol ) //如果被点击的列和上一次点击的列是同一列的话
m_fAsc = !m_fAsc; //排序方式取反,即上次是升序这次就为降序,上次降序这次就为升序
else //如果被点击的列和上一次点击的列不是同一列的话
{
m_fAsc = TRUE; //排序方式为升序T>
m_nSortedCol = pNMListView->iSubItem; //把这次点击的列序号保存到m_nSortedCol 变量中
}
m_driverlist.SortItems(ListCompare, (DWORD)this );
//SortItems函数进行排序操作,ListCompare是回调函数,SortItems函数会调用此回调函数进行排序判断
*pResult = 0;
}
以下为回调函数的实现,回调函数必须为全局函数。(写在cpp里就行)
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// LIST 消息处理程序
CDRIVER* pV=(CDRIVER*)lParamSort;
CString Comp1NAME,Comp2NAME,Comp1SUM,Comp2SUM;
int SUM1,SUM2;
int iCompRes;
switch(pV->m_nSortedCol) //判断被点击的是哪一列
{
case(0): //如果被点击的是第一列(假设第一列是字符型数据)
{
for(int i=0;i<pV->m_driverlist.GetItemCount();i++)
{
if ( lParam1==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam1的哪一行
Comp1NAME=pV->m_driverlist.GetItemText(i,0); //把这行第一列的内容提取出来
if ( lParam2==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam2的哪一行
Comp2NAME=pV->m_driverlist.GetItemText(i,0); //把这行第一列的内容提取出来
}
iCompRes=Comp1NAME.Compare(Comp2NAME); //把内容进行比较,结果保存到iCompRes上
break;
}
case(1): //如果被点击的是第二列(假设第二列是字符型数据)
{
for(int i=0;i<pV->m_driverlist.GetItemCount();i++)
{
if ( lParam1==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam1的哪一行
Comp1NAME=pV->m_driverlist.GetItemText(i,1); //把这行第二列的内容提取出来
if ( lParam2==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam2的哪一行
Comp2NAME=pV->m_driverlist.GetItemText(i,1); //把这行第二列的内容提取出来
}
iCompRes=Comp1NAME.Compare(Comp2NAME); //把内容进行比较,结果保存到iCompRes上
break;
}
case(4): //如果被点击的是第5列
{
for(int i=0;i<pV->m_driverlist.GetItemCount();i++)
{
if ( lParam1==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam1的哪一行
Comp1NAME=pV->m_driverlist.GetItemText(i,4); //把这行第五列的内容提取出来
if ( lParam2==pV->m_driverlist.GetItemData(i)) //寻找标签为参数lParam2的哪一行
Comp2NAME=pV->m_driverlist.GetItemText(i,4); //把这行第五列的内容提取出来
}
iCompRes=Comp1NAME.Compare(Comp2NAME); //把内容进行比较,结果保存到iCompRes上
break;
if(SUM1 == SUM2)
iCompRes = 0;
//标签为lParam1行第一列的数据SUM1等于标签为lParam2行第一列的数据SUM2则返回0
else
iCompRes=(SUM1 < SUM2)?-1:1;
//标签为lParam1行第一列的数据SUM1小于标签为lParam2行第一列的数据SUM2则返回-1,大于则返回1
break;
}
default: break;
}
//根据当前的排序方式进行调整,返回应当如何排序。函数返回-1代表第一项排应在第二项前面,返回1代表第一项排应在第二项后面,返回0代表两项相等。
if(pV->m_fAsc) //升序排列
return iCompRes; //switch里面的比较就是按照升序排列来返回结果
else //降序排列
return iCompRes*-1;
}