CListCtrll控件的使用,讲得较为详细

  1. 1.CListCtrl控件  
  2. CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件。他可以有四显示方式,Report、List、Icon、SmallIcon。Report报告式列表视图方式在数据库开发中是最常用的一种方式。在控件"properties"的Styles选项卡中在View项可以选择Report方式。Report方式中列表控件的显示方式是有行和列的,行又叫做Item,但有多列是我们只能操作每一行的第零列,也就是最前列。  
  3. 2.与CListCtrl控件相关的数据类型  
  4. (1)LV_COLUMN结构  
  5. 该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中插入新的一列,需要用到该结构。  
  6. LV_COLUMN结构定义如下:  
  7. typedef struct_LV_COLUMN{  
  8. UINT mask;         //屏蔽位的组合,表明哪些成员是有效的  
  9. int fmt;          //该列的表头和子项的标题显示格式(LVCF_FMT)  
  10. int cx;           //以象素为单位的列的宽度(LVCF_FMT)  
  11. LPTSTR pszText;   //指向存放列表头标题正文的缓冲区(LVCF_TEXT)  
  12. int cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)  
  13. int iSubItem;     //说明该列的索引(LVCF_SUBITEM)  
  14. }LVCOLUMN;  
  15. (2)LV_ITEM结构  
  16. 该结构用来描述一个表项或一个子项,它包含了项的各种属性,定义为:  
  17. typedef struct_LV_ITEM{  
  18. UINT mask;         //屏蔽位的组合,表明哪些成员是有效的  
  19. int iItem;        //从0开始编号的表项索引(行索引)  
  20. int iSubItem;     //从1开始编号的子项索引(列索引),因为编号0的列使用InsertItem时已经写入数据  
  21. UINT state;        //项的状态(LVIF_STATE)  
  22. UINT stateMask;    //项的状态屏蔽  
  23. LPTSTR pszText;    //指向存放项的正文的索引区(LVIF_TEXT)  
  24. int cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)  
  25. int iImage;       //图标的索引(LVIF_IMAGE)  
  26. LPARAM lParam;     //32位的附加数据(LV_PARAM)  
  27. }LV_ITEM;  
  28. 3.CListCtrl类的成员函数  
  29. (1)列的插入和删除项  
  30. 在初始化列表视图时,先要调用InsertColumn插入各个列,该函数的声明为:  
  31. int InsertColumn(int nCol,const LV_COLUMN *pColumn);  
  32. 其中参数nCol是新列的索引,参数pColumn指向一个LV_COLUMN结构,函数根据该结构来创建新的列。若插入成功,函数返回新的索引;否则返回-1。  
  33. 要删除某列,应调用DeleteColumn()函数,其声明为:  
  34. BOOL DeleteColumn(int nCol);  
  35. (2)表项的插入  
  36. 要插入新的表项,应调用InsertItem。如果要显示图标,则应该创建一个CImageList对象并使该对象包含用作显示图标的位图序列,然后调用  
  37. SetImageList为列表视图设置位图序列。函数的声明为:  
  38. int InsertItem(const LV_ITEM *pItem);  
  39. 或者  
  40. int InsertItem( int nItem, LPCTSTR lpszItem);  
  41. int InsertItem( int nItem, LPCTSTR lpszItem, int nImage );  
  42. 使用的时候多用第二种和第三种。因此省去了定义并初始化LV_ITEM数据类型这一步。  
  43. 参数pItem指向一个LV_ITEM结构,该结构提供了对表项的描述。若插入成功,返回新表项的索引;否则返回-1。  
  44. 参数nItem是表项的索引(行索引,从0开始);参数lpszItem为控件头的名字。  
  45. (3)函数GetItemText()和函数SetItemText()用于查询和设置表项以及子项显示的正文。  
  46. SetItemText()函数的一个重要用途就是对子项进行初始化。函数声明为:  
  47. int GetItemText(int nItem,int nSubItem,LTPSTR lpszText,int nLen) const;  
  48. CString GetItemText(int nItem,int nSubItem) const;  
  49. BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText);  
  50. 其中,参数nItem是表项的索引(行索引),nSubItem是子项的索引(列索引),若nSubItem为0说明函数是针对表项的。参数lpszText指向正文缓冲区,参数nLen说明缓冲区的大小。  
  51. 4.例1:在一个对话框中初始化列表框  
  52. 在对话框的初始化函数中添加对CListCtr控件的初始化代码  
  53. BOOL CDlgall::OnInitDialog()   
  54. {  
  55. CDialog::OnInitDialog();  
  56. LV_COLUMN lvc;        //定义一个LV_COLUMN数据类型用来描述一个列  
  57. char *display[4]={"学号","姓名","性别","出生日期"};  
  58.         lvc.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;  
  59. lvc.fmt = LVCFMT_LEFT;        //设置对齐方式  
  60. lvc.cx = 80;                  //设置各列的宽度为80象素  
  61. for(int i = 0; i < 4; i++)    //插入各列的表头  
  62. {  
  63.    lvc.iSubItem = i;  
  64.    lvc.pszText = display[i];  
  65.    m_List.InsertColumn(i,&lvc); //设置的是第i列的表头,具体样式以定义的lvc的属性为准  
  66.    //上句等价于m_List.InsertColumn(i,display[i],LVCF_LEFT,80); 即设置各列表头的样式  
  67. }  
  68. m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_FULLROWSELECT);  
  69. //改变列表控件的显示风格为全部选中状态  
  70. CDlgall::OnLoadAll();  
  71. return TRUE; // return TRUE unless you set the focus to a control  
  72.                // EXCEPTION: OCX Property Pages should return FALSE  
  73. }  
  74.   
  75. 例2:从数据源中读取数据并在列表控件中进行显示  
  76. void CDlgall::OnLoadAll()   
  77. {  
  78. char buffer[256];  
  79. m_List.DeleteAllItems(); //清空所有条目  
  80. if(!pset->IsOpen())       //判断记录集是否打开。如果关闭就打开记录集  
  81.    pset->Open();   
  82. CString str1;  
  83. pset->MoveFirst();        //将游标指向记录集的第一条记录  
  84. for(int i = 0;!pset->IsEOF();i++)   //插入表项  
  85. {  
  86.      m_List.InsertItem(i,LPCTSTR(pset->m_number));   
  87.      //InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)  
  88.      //以后各列使用SetItemText()函数来存放数据。  
  89.       
  90.     m_List.SetItemText(i,1,LPCTSTR(pset->m_name));   
  91.     //设置第i行第1列的的数据为数据源中读取的当前记录某个字段的值  
  92.        
  93.      m_List.SetItemText(i,2,LPCTSTR(pset->m_sex));   //以下类似  
  94.      str1 = pset->m_date.Format("%x");                 
  95.      m_List.SetItemText(i,3,str1);  
  96.      pset->MoveNext();           //游标下移  
  97. }  
  98. SetDlgItemText(IDC_EDIT2,itoa(pset->GetRecordCount(),buffer,10));   
  99. //获取总的记录数并在控件IDC_EDIT2中进行显示  
  100. pset->Close();  
  101. }  
  102. 例3.点击列表控件的列时实现自动排序  
  103. (1)首先在对话框的头文件中加入自定义排序函数SortList(CString &str)的函数声明。  
  104. (2)然后定义SortList()函数  
  105. void CDlgall::SortList(CString &str)  
  106. {  
  107.     m_list.DeleteAllItems(); //清空所有条目  
  108.     pset->m_strSort = str;    //设定要排序的字段  
  109.     CDlgall::OnLoadAll();     //显示所有记录  
  110.     return;  
  111. }  
  112. 说明:成员m_strSort是CRecordset类的公共成员数据,用于指定排序。m_strSort实际上包含了ORDER BY子句的内容,但它不含ORDER BY关键字。m_strSort的一个例子为:  
  113. m_pSet->m_strSort=“name DESC”; //按CourseID的降序排列记录  
  114. m_pSet->Open();  
  115.   
  116. (3)为列表控件的LV_COLUMNCLICK消息添加消息响应函数  
  117. void CDlgall::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)   
  118. {  
  119. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;  
  120. //根据列字段进行排序  
  121. switch(pNMListView->iSubItem)   
  122. {  
  123. case 0:  
  124.    Sortlist(CString("number"));  
  125.    break;  
  126. case 1:  
  127.    Sortlist(CString("[name]"));  
  128.    break;  
  129. case 2:  
  130.    Sortlist(CString("[date]"));  
  131.    break;  
  132. case 3:  
  133.    Sortlist(CString("[sex]"));  
  134.    break;  
  135. case 4:  
  136.    Sortlist(CString("[age]"));  
  137.    break;  
  138. }  
  139. *pResult = 0;  
  140. }  
  141. 例4 双击CListCtrl中的某条记录进行修改  
  142. void CDlgall::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)   
  143. {  
  144.     CDlgall::OnModify(); //双击某条记录则表示要修改记录  
  145.     *pResult = 0;  
  146. }  
  147. 例5 根据输入的字段进行查询  
  148. void CDlgall::OnFind()   
  149. {  
  150.     m_List.DeleteAllItems(); //清空列表以显示查询到的记录  
  151.     UpdateData(true);     
  152.     //对m_number进行字符处理,根据检查号位数在检查号前加零  
  153.     int len = strlen(m_number);  
  154.     char temp[10];  
  155.     switch(len) {  
  156.         case 1:  
  157.             strcpy(temp,"00000");break;  
  158.         case 2:  
  159.             strcpy(temp,"0000");break;  
  160.         case 3:  
  161.             strcpy(temp,"000");break;  
  162.         case 4:  
  163.             strcpy(temp,"00");break;  
  164.         case 5:  
  165.             strcpy(temp,"0");break;  
  166.         default:  
  167.                 strcpy(temp,"");  
  168.     }  
  169.     strcat(temp,m_number);  
  170.     m_number =temp;  
  171.     //查找对应的参数  
  172.     CSetdata*pset = new CSetdata();  
  173.     pset->m_strFilter = "number=?"//设定过滤记录集的参数  
  174.     pset->Open();  
  175.     pset->number = m_number;  
  176.    pset->Requery(); //查询到符合条件的所有记录,并存放在记录集中  
  177.     //在列表控件中显示记录  
  178.     CString str1;  
  179.     if(!pset->IsEOF())  
  180.     {  
  181.         //以下插入单条记录  
  182.         char buffer[256];  
  183.         LV_ITEM lvi;  
  184.         lvi.mask = LVIF_TEXT;  
  185.         lvi.iSubItem = 0;  
  186.         int i = 0;  
  187.         m_List.InsertItem(i,LPCTSTR(pset->m_number),0);  
  188.         m_List.SetItemText(i,1,LPCTSTR(pset->m_name));  
  189.         str1 = pset->m_date.Format("%x");  
  190.         m_List.SetItemText(i,2,str1);  
  191.         m_List.SetItemText(i,3,LPCTSTR(pset->m_sex));  
  192.         m_List.SetItemText(i,4,LPCTSTR(ltoa(pset->m_age,buffer,10)));  
  193.         m_List.SetItemText(i,5,LPCTSTR(pset->m_zy));  
  194.         m_List.SetItemText(i,6,LPCTSTR(pset->m_mode));  
  195.         m_List.SetItemText(i,7,LPCTSTR(pset->m_bl));  
  196.         pset->Close();  
  197.     }  
  198.     else  
  199.     {  
  200.         CDlgall::OnLoadAll(); //如果没有找到相关记录,显示所有的记录  
  201.         AfxMessageBox("对不起,没有相关记录!");  
  202.     }     
  203. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值