列表视图控件简单易用,但是不能进行编辑。可以通过两种方法实现列表视图控件的可编辑功能,
第一种是在要编辑的单元格位置创建一个编辑框控件。
第二种是创建一个编辑框控件,并将该控件移动到要编辑的单元格所在的位置。
本实例使用的是第二种方法,当用户单击表格中的单元格时,将编辑框显示在单元格中,用户可以在编辑框中输入数据,在编辑框失去焦点时将数据写入单元格。
(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>