ListCtrl—具有文本录入功能的列表视图控件

列表视图控件简单易用,但是不能进行编辑。可以通过两种方法实现列表视图控件的可编辑功能,
第一种是在要编辑的单元格位置创建一个编辑框控件。
第二种是创建一个编辑框控件,并将该控件移动到要编辑的单元格所在的位置。
本实例使用的是第二种方法,当用户单击表格中的单元格时,将编辑框显示在单元格中,用户可以在编辑框中输入数据,在编辑框失去焦点时将数据写入单元格。
(1)新建一个基于对话框的应用程序。
(2)向窗体中添加一个列表视图控件。
(3)以CEdit类为基类创建新类CListEdit。
(4)处理编辑框的WM_KILLFOCUS消息,使其在失去焦点时将数据显示在列表视图控件的单元格中,代码如下
<span style="font-size:18px;">void CListEdit::OnKillFocus(CWnd* pNewWnd)              <span style="color:#ff0000;"><strong>//<span style="font-size:18px;">CEdit类为基类</span></strong></span>
{
 CGridList * temp = (CGridList *)GetParent();          //获得父窗口指针
 if(temp)
 {
  temp->DisposeEdit();                      //设置编辑框控件
 }
}</span>

(5)从CListCtrl类中派生一个CGridList类,改写PreSubclassWindow虚函数,为列表视图控件设置风格,创建编辑框,代码如下:
<span style="font-size:18px;">{
 // 修改列表视图控件风格
 ModifyStyle(LVS_EDITLABELS,0);
 ModifyStyle(0,LVS_REPORT);
 ModifyStyle(0,LVS_SHOWSELALWAYS);
 //设置列表视图控件扩展风格
 SetExtendedStyle(LVS_EX_FLATSB
  |LVS_EX_FULLROWSELECT
  |LVS_EX_HEADERDRAGDROP
  |LVS_EX_ONECLICKACTIVATE
  |LVS_EX_GRIDLINES);
 //创建编辑框控件
 edit.Create(WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|WS_BORDER,
  CRect(0,40,10,50),this,1001);
 CListCtrl::PreSubclassWindow();
}</span>

(6)根据鼠标单击时的位置确定编辑框应该出现的位置,需要处理表格的WM_LBUTTONDOWN消息,以此来确定用户单击的单元格的坐标,代码如下:
<span style="font-size:18px;">void CGridList::OnLButtonDown(UINT nFlags, CPoint point) 
{
 CListCtrl::OnLButtonDown(nFlags, point);
 LVHITTESTINFO info;
 info.pt=point;
 info.flags=LVHT_ONITEMLABEL;
 if(SubItemHitTest(&info)>=0)
 {
  row=info.iItem;
  col=info.iSubItem;
  ShowEdit();
 }
}</span>

(7)添加ShowEdit函数,用于显示编辑框,代码如下:
<span style="font-size:18px;">void CGridList::ShowEdit()
{
 CRect rect;
 GetSubItemRect(row,col,LVIR_LABEL,rect);   //获得列表项区域
 CString str;
 str = GetItemText(row,col);                     //获得行列信息
 edit.MoveWindow(rect);                   //移动编辑框位置
 edit.SetWindowText(str);                  //设置编辑框文本
 edit.ShowWindow(SW_SHOW);               //显示编辑框
 edit.SetSel(0,100);                          //设置编辑框中文本选中
 edit.SetFocus();                                //设置编辑框焦点
 UpdateWindow();                           //更新窗口
}</span>

(8)添加DisposeEdit函数,为列表视图控件的单元格赋值并隐藏编辑框,代码如下:
<span style="font-size:18px;">void CTextInListDlg::OnButsave() 
{
 ADOConn m_AdoConn;
 m_AdoConn.OnInitADOConn();               //连接数据库
 CString sql,str,str1,str2;
 sql.Format("delete from bumenbiao");        //设置删除语句
 m_AdoConn.ExecuteSQL((_bstr_t)sql);            //执行删除语句
 int m=0;
 for(int i=0;i<m_Grid.GetItemCount();i++)
 {
  //获得列表中数据
  str=m_Grid.GetItemText(i,m);       
  str1=m_Grid.GetItemText(i,m+1);
  str2=m_Grid.GetItemText(i,m+2);
  if(!str.IsEmpty() || !str1.IsEmpty() || !str2.IsEmpty())
  {
   //将列表中数据插入到数据库中
   sql.Format("insert into bumenbiao (职业编号,职业名称,负责人) values ('%s','%s','%s')",str,str1,str2);
   m_AdoConn.ExecuteSQL((_bstr_t)sql); //执行插入语句
  }
 }
 m_AdoConn.ExitConnect();
 MessageBox("保存完毕");
}</span>







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值