1.CListCtrl控件

CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件。他可以有四显示方式,Report、List、Icon、SmallIcon。Report报告式列表视图方式在数据库开发中是最常用的一种方式。在控件"properties"的Styles选项卡中在View项可以选择Report方式。Report方式中列表控件的显示方式是有行和列的,行又叫做Item,但有多列是我们只能操作每一行的第零列,也就是最前列。

2.与CListCtrl控件相关的数据类型
(1)LV_COLUMN结构
该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中插入新的一列,需要用到该结构。
LV_COLUMN结构定义如下:
typedef struct_LV_COLUMN{
UINT mask;         //屏蔽位的组合,表明哪些成员是有效的
int  fmt;          //该列的表头和子项的标题显示格式(LVCF_FMT)
int  cx;           //以象素啊为单位的列的宽度(LVCF_FMT)
LPTSTR  pszText;   //指向存放列表头标题正文的缓冲区(LVCF_TEXT)
int  cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)
int  iSubItem;     //说明该列的索引(LVCF_SUBITEM)
}LVCOLUMN;

(2)LV_ITEM结构
该结构用来描述一个表项或一个子项,它包含了项的各种属性,定义为:
typedef struct_LV_ITEM{
UINT mask;         //屏蔽位的组合,表明哪些成员是有效的
int  iItem;        //从0开始编号的表项索引(行索引)
int  iSubItem;     //从1开始编号的子项索引(列索引),因为编号0的列使用InsertItem时已经写入数据
UINT state;        //项的状态(LVIF_STATE)
UINT stateMask;    //项的状态屏蔽
LPTSTR pszText;    //指向存放项的正文的索引区(LVIF_TEXT)
int  cchTextMax;   //标题正文缓冲区的长度(LVCF_TEXT)
int  iImage;       //图标的索引(LVIF_IMAGE)
LPARAM lParam;     //32位的附加数据(LV_PARAM)
}LV_ITEM;

3.CListCtrl类的成员函数
(1)列的插入和删除项
在初始化列表视图时,先要调用InsertColumn插入各个列,该函数的声明为:
int InsertColumn(int nCol,const LV_COLUMN *pColumn);
其中参数nCol是新列的索引,参数pColumn指向一个LV_COLUMN结构,函数根据该结构来创建新的列。若插入成功,函数返回新的索引;否则返回-1。
要删除某列,应调用DeleteColumn()函数,其声明为:
BOOL DeleteColumn(int nCol);

(2)表项的插入
要插入新的表项,应调用InsertItem。如果要显示图标,则应该创建一个CImageList对象并使该对象包含用作显示图标的位图序列,然后调用

SetImageList为列表视图设置位图序列。函数的声明为:
int InsertItem(const LV_ITEM *pItem);
或者
int InsertItem( int nItem, LPCTSTR lpszItem);
int InsertItem( int nItem, LPCTSTR lpszItem,  int nImage );
使用的时候多用第二种和第三种。因此省去了定义并初始化LV_ITEM数据类型这一步。
参数pItem指向一个LV_ITEM结构,该结构提供了对表项的描述。若插入成功,返回新表项的索引;否则返回-1。
参数nItem是表项的索引(行索引,从0开始);参数lpszItem为控件头的名字。

(3)函数GetItemText()和函数SetItemText()用于查询和设置表项以及子项显示的正文。
SetItemText()函数的一个重要用途就是对子项进行初始化。函数声明为:
int GetItemText(int nItem,int nSubItem,LTPSTR lpszText,int nLen) const;
CString GetItemText(int nItem,int nSubItem) const;
BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText);
其中,参数nItem是表项的索引(行索引),nSubItem是子项的索引(列索引),若nSubItem为0说明函数是针对表项的。参数lpszText指向正文缓冲区,参数nLen说明缓冲区的大小。

4.例1:在一个对话框中初始化列表框
在对话框的初始化函数中添加对CListCtr控件的初始化代码
BOOL CDlgall::OnInitDialog()
{
 CDialog::OnInitDialog();
 LV_COLUMN lvc;        //定义一个LV_COLUMN数据类型用来描述一个列
 char *display[4]={"学号","姓名","性别","出生日期"};
        lvc.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH;
 lvc.fmt = LVCFMT_LEFT;        //设置对齐方式
 lvc.cx = 80;                  //设置各列的宽度为80象素
 for(int i = 0; i < 4; i++)    //插入各列的表头
 {
  lvc.iSubItem = i;
  lvc.pszText = display[i];
  m_List.InsertColumn(i,&lvc);  //设置的是第i列的表头,具体样式以定义的lvc的属性为准
  //上句等价于m_List.InsertColumn(i,display[i],LVCF_LEFT,80); 即设置各列表头的样式
 }
 m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
 //改变列表控件的显示风格为全部选中状态
 CDlgall::OnLoadAll();

return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

例2:从数据源中读取数据并在列表控件中进行显示

void CDlgall::OnLoadAll()
{
 char buffer[256];
 m_List.DeleteAllItems();  //清空所有条目
 if(!pset->IsOpen())       //判断记录集是否打开。如果关闭就打开记录集
  pset->Open(); 
 CString str1;
 pset->MoveFirst();        //将游标指向记录集的第一条记录

for(int i = 0;!pset->IsEOF();i++)   //插入表项
 {
     m_List.InsertItem(i,LPCTSTR(pset->m_number));
     //InsertItem向CListCtr控件申请一行用来存放数据,同时写入一行的头名称(即编号为0列的数据)
     //以后各列使用SetItemText()函数来存放数据。
    
     m_List.SetItemText(i,1,LPCTSTR(pset->m_name)); 
     //设置第i行第1列的的数据为数据源中读取的当前记录某个字段的值
    
     m_List.SetItemText(i,2,LPCTSTR(pset->m_sex));   //以下类似
     str1 = pset->m_date.Format("%x");              
     m_List.SetItemText(i,3,str1);
     pset->MoveNext();           //游标下移
 }
 SetDlgItemText(IDC_EDIT2,itoa(pset->GetRecordCount(),buffer,10));
 //获取总的记录数并在控件IDC_EDIT2中进行显示
 pset->Close();
}

例3.点击列表控件的列时实现自动排序
(1)首先在对话框的头文件中加入自定义排序函数SortList(CString &str)的函数声明。
(2)然后定义SortList()函数
void CDlgall::SortList(CString &str)
{
    m_list.DeleteAllItems();  //清空所有条目
    pset->m_strSort = str;    //设定要排序的字段
    CDlgall::OnLoadAll();     //显示所有记录
    return;
}
说明:成员m_strSort是CRecordset类的公共成员数据,用于指定排序。m_strSort实际上包含了ORDER BY子句的内容,但它不含ORDER BY关键字。m_strSort的一个例子为:
m_pSet->m_strSort=“name DESC”; //按CourseID的降序排列记录
m_pSet->Open();

(3)为列表控件的LV_COLUMNCLICK消息添加消息响应函数
void CDlgall::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
 //根据列字段进行排序
 switch(pNMListView->iSubItem)
 {
 case 0:
  Sortlist(CString("number"));
  break;
 case 1:
  Sortlist(CString("[name]"));
  break;
 case 2:
  Sortlist(CString("[date]"));
  break;
 case 3:
  Sortlist(CString("[sex]"));
  break;
 case 4:
  Sortlist(CString("[age]"));
  break;
 }
 *pResult = 0;
}

例4 双击CListCtrl中的某条记录进行修改

void CDlgall::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
    CDlgall::OnModify(); //双击某条记录则表示要修改记录
    *pResult = 0;
}

例5 根据输入的字段进行查询
void CDlgall::OnFind()
{
    m_List.DeleteAllItems();  //清空列表以显示查询到的记录
    UpdateData(true);  
    //对m_number进行字符处理,根据检查号位数在检查号前加零
    int len = strlen(m_number);
    char temp[10];
    switch(len) {
        case 1:
            strcpy(temp,"00000");break;
        case 2:
            strcpy(temp,"0000");break;
        case 3:
            strcpy(temp,"000");break;
        case 4:
            strcpy(temp,"00");break;
        case 5:
            strcpy(temp,"0");break;
        default:
                strcpy(temp,"");
    }
    strcat(temp,m_number);
    m_number =temp;
    //查找对应的参数
    CSetdata*pset = new CSetdata();
    pset->m_strFilter = "number=?";  //设定过滤记录集的参数
    pset->Open();
    pset->number = m_number;
    pset->Requery();  //查询到符合条件的所有记录,并存放在记录集中
    //在列表控件中显示记录
    CString str1;
    if(!pset->IsEOF())
    {
        //以下插入单条记录
        char buffer[256];
        LV_ITEM lvi;
        lvi.mask = LVIF_TEXT;
        lvi.iSubItem = 0;
        int i = 0;
        m_List.InsertItem(i,LPCTSTR(pset->m_number),0);
        m_List.SetItemText(i,1,LPCTSTR(pset->m_name));
        str1 = pset->m_date.Format("%x");
        m_List.SetItemText(i,2,str1);
        m_List.SetItemText(i,3,LPCTSTR(pset->m_sex));
        m_List.SetItemText(i,4,LPCTSTR(ltoa(pset->m_age,buffer,10)));
        m_List.SetItemText(i,5,LPCTSTR(pset->m_zy));
        m_List.SetItemText(i,6,LPCTSTR(pset->m_mode));
        m_List.SetItemText(i,7,LPCTSTR(pset->m_bl));
        pset->Close();
    }
    else
    {
        CDlgall::OnLoadAll();  //如果没有找到相关记录,显示所有的记录
        AfxMessageBox("对不起,没有相关记录!");
    }  
}

控件CListCtr详解的更多相关文章

  1. WebBrowser控件使用详解

    原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...

  2. 串口通信-MSComm控件使用详解

    串口通信-MSComm控件使用详解 2012年11月13日 09:35:45 他山之石可以攻玉 阅读数:37952更多 个人分类: 控件编程Delphi编程   MSComm 控件通过串行端口传输和接 ...

  3. Flash播放控件属性详解

    Flash 播放控件属性详解 一.属性篇 1.AlignMode(读写)  语法:AlignMode As Long  说明:对齐方式(与SAlign 属性联动).当控件的长宽比例与影片不一致且WMo ...

  4. Android UI组件----AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...

  5. VC/MFC中的CComboBox控件使用详解

    CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...

  6. Android开发之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...

  7. Android列表控件ListView详解

    ListView绝对可以称得上是Android中最常用的控件之一,几乎所有应用程序都会用到它. 由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候 ...

  8. VB TreeView控件使用详解

    来源:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html 三小时快速掌握TreeView树状控件的使用.能不能掌握控件的 ...

  9. asp.net web 开发登录相关操作的控件LoginName、LoginStatus和LoginView控件使用详解

    http://book.51cto.com/art/200909/154039.htm http://book.51cto.com/art/200909/154041.htm ASP.NET提供了一套 ...

随机推荐

  1. [Luogu] P4460 [CQOI2018]解锁屏幕

    题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案.如下面三个例子所示: ...

  2. mySQL--找出各科最高成绩

    //找出各科最高成绩create table gradeMax(id int primary key auto_increment,name varchar(20),subject varchar(2 ...

  3. PS学习一

    1.使用缩放工具时是对文档窗口进行的缩放,它只影响视图比例:而对图像的缩放则是指对图像文件本身进行的物理缩放,它会使图像的内容变大或变小. 2.分辨率是指单位长度内包含的像素点的数量,它的单位通常为像 ...

  4. Python列表、元组、字典、集合的内置使用方法

    列表: 是一种可以存储多个值得数据容器 内容是有序的 可以存储任何数据类型 可以存储重复的元素 是可变类型(当内容发生变化时id不变) 元组: 也是一种可以存储多个值得数据容器 元组中的元素不可以被修 ...

  5. PHP面向对象设计五大原则(SOLID)梳理总结

    PHP设计原则梳理,参考<PHP核心技术与最佳实践>.<敏捷开发原则.模式与实践>,文章PHP面向对象设计的五大原则.设计模式原则SOLID 单一职责原则(Single Res ...

  6. MT4系统自带指标代码

    MT4系统自带指标代码 ~ Accelerator Oscillator 震荡加速指标:                   double iAC() ~ Accumulation/Distribut ...

  7. jquery 修改input输入框的 readOnly属性 && input输入框隐藏

    html的代码 <div class="control-group"> <label class="control-label required&quo ...

  8. Mac os安装MySQL数据库,系统提示mysql: command not found该怎么办

    当我们安装好MySQL后,在终端输入mysql命令,发现并不能看到自己安装的数据库,这是因为你没有配置环境变量. 在os系统中安装MySQL数据库默认保存在/usr/local/mysql 那么我们应 ...

  9. Jmeter关联-获取token值

    1. token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件:也叫关联 2. cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某 ...

  10. webdriver学习笔记(一):webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu

    按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...