课设补充

之前总结的遗漏部分,发现用的还挺频繁,粘在这里方便参考,格式很不严谨,大家看也勿抠代码,会意为主。
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数据库驱动代码
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);

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并更新链表
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));  
8.列表控件排序
 为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;
}
CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第二名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值