ListCtrl控件编辑.docx
- 文档编号:18213685
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:18
- 大小:36.68KB
ListCtrl控件编辑.docx
《ListCtrl控件编辑.docx》由会员分享,可在线阅读,更多相关《ListCtrl控件编辑.docx(18页珍藏版)》请在冰点文库上搜索。
ListCtrl控件编辑
本文全面介绍了如何编辑ListControl里面的任何子项
介绍
内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到ListControl,ListControl有很多方法可以显示数据,可ListControl里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎么实现这个功能。
这篇文章是基于VCMFC滴,用别的功具的娃们当然也可以看看,呵呵,不多说,先实现图上okexit两个按钮:
voidCMultipleColumnsDlg:
:
OK()
{
CDialog:
:
EndDialog(0);//Addthisline
}
voidCMultipleColumnsDlg:
:
OnExit()
{
CDialog:
:
EndDialog(0);//Addthisline
}
接下来添加一个ListCtrl控件,记得把ListCtrl的style设置成Report,这个是为了实现我们要多行显示的功能
然后增加一个文本框EditBox去掉它的Borderstyle属性
增加一个InsertItems()成员函数,用来写入ListControl的显示内容
voidCMultipleColumnsDlg:
:
InsertItems()
{
HWNDhWnd=:
:
GetDlgItem(m_hWnd,IDC_LIST1);
//SettheLVCOLUMNstructurewiththerequired
//columninformation
LVCOLUMNlist;
list.mask=LVCF_TEXT|LVCF_WIDTH|
LVCF_FMT|LVCF_SUBITEM;
list.fmt=LVCFMT_LEFT;
list.cx=50;
list.pszText="S.No";
list.iSubItem=0;
//Insertsthecolumn
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)0,(WPARAM)&list);
list.cx=100;
list.pszText="Name";
list.iSubItem=1;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
list.cx=100;
list.pszText="Address";
list.iSubItem=2;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
list.cx=100;
list.pszText="Country";
list.iSubItem=2;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
//InsertsfirstRowwithfourcolumns.
SetCell(hWnd,"1",0,0);
SetCell(hWnd,"Prabhakar",0,1);
SetCell(hWnd,"Hyderabad",0,2);
SetCell(hWnd,"India",0,3);
//InsertssecondRowwithfourcolumns.
SetCell(hWnd,"2",1,0);
SetCell(hWnd,"Uday",1,1);
SetCell(hWnd,"Chennai",1,2);
SetCell(hWnd,"India",1,3);
}
自定义的SetCell()函数,用来实现插入数据用的
voidCMultipleColumnsDlg:
:
SetCell(HWNDhWnd1,
CStringvalue,intnRow,intnCol)
{
TCHARszString[256];
wsprintf(szString,value,0);
//FilltheLVITEMstructurewiththe
//valuesgivenasparameters.
LVITEMlvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nRow;
lvItem.pszText=szString;
lvItem.iSubItem=nCol;
if(nCol>0)
//setthevalueoflistItem
:
:
SendMessage(hWnd1,LVM_SETITEM,
(WPARAM)0,(WPARAM)&lvItem);
else
//InsertthevalueintoList
ListView_InsertItem(hWnd1,&lvItem);
}
//通过行和列得到项目里面的数据
CStringCMultipleColumnsDlg:
:
GetItemText(
HWNDhWnd,intnItem,intnSubItem)const
{
LVITEMlvi;
memset(&lvi,0,sizeof(LVITEM));
lvi.iSubItem=nSubItem;
CStringstr;
intnLen=128;
intnRes;
do
{
nLen*=2;
lvi.cchTextMax=nLen;
lvi.pszText=str.GetBufferSetLength(nLen);
nRes=(int):
:
SendMessage(hWnd,
LVM_GETITEMTEXT,(WPARAM)nItem,
(LPARAM)&lvi);
str.ReleaseBuffer();
returnstr;
}
//为窗口类添加两个成员变量:
intnItem,nSubItem;
用Classwizard添加NM_CLICK响应,当用户点击任何位置时,就会对应出现一个EditBox,并可以修改数据
voidCMultipleColumnsDlg:
:
OnClickList(
NMHDR*pNMHDR,LRESULT*pResult)
{
Invalidate();
HWNDhWnd1=:
:
GetDlgItem(m_hWnd,IDC_LIST1);
LPNMITEMACTIVATEtemp=(LPNMITEMACTIVATE)pNMHDR;
RECTrect;
//gettherownumber
nItem=temp->iItem;
//getthecolumnnumber
nSubItem=temp->iSubItem;
if(nSubItem==0||nSubItem==-1||nItem==-1)
return;
//RetrievethetextoftheselectedsubItem
//fromthelist
CStringstr=GetItemText(hWnd1,nItem,
nSubItem);
RECTrect1,rect2;
//thismacroisusedtoretrievetheRectanle
//oftheselectedSubItem
ListView_GetSubItemRect(hWnd1,temp->iItem,
temp->iSubItem,LVIR_BOUNDS,&rect);
//GettheRectangeofthelistControl
:
:
GetWindowRect(temp->hdr.hwndFrom,&rect1);
//GettheRectangeoftheDialog
:
:
GetWindowRect(m_hWnd,&rect2);
intx=rect1.left-rect2.left;
inty=rect1.top-rect2.top;
if(nItem!
=-1)
:
:
SetWindowPos(:
:
GetDlgItem(m_hWnd,IDC_EDIT1),
HWND_TOP,rect.left+x,rect.top+4,
rect.right-rect.left-3,
rect.bottom-rect.top-1,NULL);
:
:
ShowWindow(:
:
GetDlgItem(m_hWnd,IDC_EDIT1),SW_SHOW);
:
:
SetFocus(:
:
GetDlgItem(m_hWnd,IDC_EDIT1));
//DrawaRectanglearoundtheSubItem
:
:
Rectangle(:
:
GetDC(temp->hdr.hwndFrom),
rect.left,rect.top-1,rect.right,rect.bottom);
//SetthelistItemtextintheEditBox
:
:
SetWindowText(:
:
GetDlgItem(m_hWnd,IDC_EDIT1),str);
*pResult=0;
}
TohandletheENTERkeyweneedtowritethevirtualfunctionOnOk(响应ENTER键)
afx_msgvoidOnOK();
InMultipleColumnsDlg.cppwritethefollowingcode.
//ThisfunctionhandlestheENTERkey
voidCMultipleColumnsDlg:
:
OnOK()
{
CWnd*pwndCtrl=GetFocus();
//getthecontrolIDwhichis
//presentlyhavingthefocus
intctrl_ID=pwndCtrl->GetDlgCtrlID();
CStringstr;
switch(ctrl_ID)
{//ifthecontrolistheEditBox
caseIDC_EDIT1:
//getthetextfromtheEditBox
GetDlgItemText(IDC_EDIT1,str);
//setthevalueinthelistContorlwiththe
//specifiedItem&SubItemvalues
SetCell(:
:
GetDlgItem(m_hWnd,IDC_LIST1),
str,nItem,nSubItem);
:
:
SendDlgItemMessage(m_hWnd,IDC_EDIT1,
WM_KILLFOCUS,0,0);
:
:
ShowWindow(:
:
GetDlgItem(m_hWnd,IDC_EDIT1),
SW_HIDE);
break;
default:
break;
}
}
最后一步在OnInitDialog中设置ListControl的样式
ListView_SetExtendedListViewStyle(:
:
GetDlgItem
(m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT|
LVS_EX_GRIDLINES);
InsertItems();
:
:
ShowWindow(:
:
GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
Introduction
AlmosteveryoneofuswhoareprogramminginVC++,willcomeacrosstheListcontrol.TherearemanycaseswherethereisaneedtorepresentdatainListControlinmultiplecolumns.BydefaultitisnotpossibletomodifythedataintheListcontrolitself.InthissmallarticleIamputtingasimplewaytoeditanyvalueinanycolumninaReportstyleListcontrol.Thelogichereissimple,wheneveruserclicksonansub-itemwhichhewantstomodifyatthatplaceIamdisplayingaeditboxandallowingtomodifythevalue.OncemodifiedandbyclickingtheENTERkey,theupdatedvalueissetintheListcontrol.HereIamassumingtheuserisfamiliarwithVC++andusingClassWizard
Implementationsteps:
1.UsingMFCAppWizard,createaDialogBasedapplication.GivetheapplicationnameasMultipleColumns.BydefaultthewizardaddsOKandCancelbuttonstotheDialog,Removethesetwobuttons.
2.NowAddaList-ControlandinpropertieschangethestyletoReport,thisstyleisnecessaryifwewantmultiplecolumns
3.AddtwobuttonstotheDialogandnamethemasOKandExit
4.AddoneEditboxandinthepropertiesremovetheBorderstyle
5.UsingtheClassWizardaddthemessagehandlersfortheOKandExitButtons.Addthefollowingcodetothosefunctions
Collapse
CopyCode
voidCMultipleColumnsDlg:
:
OK()
{
CDialog:
:
EndDialog(0);//Addthisline
}
Collapse
CopyCode
voidCMultipleColumnsDlg:
:
OnExit()
{
CDialog:
:
EndDialog(0);//Addthisline
}
6.AddafunctioncalledInsertItems()totheCMulipleColumnsDlgclass.
Collapse
CopyCode
voidInsertItems();
Inthefunctionhandleraddthefollowingcode
Collapse
CopyCode
//Thisfunctioninsertsthedefaultvalues
//intothelistControl
voidCMultipleColumnsDlg:
:
InsertItems()
{
HWNDhWnd=:
:
GetDlgItem(m_hWnd,IDC_LIST1);
//SettheLVCOLUMNstructurewiththerequired
//columninformation
LVCOLUMNlist;
list.mask=LVCF_TEXT|LVCF_WIDTH|
LVCF_FMT|LVCF_SUBITEM;
list.fmt=LVCFMT_LEFT;
list.cx=50;
list.pszText="S.No";
list.iSubItem=0;
//Insertsthecolumn
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)0,(WPARAM)&list);
list.cx=100;
list.pszText="Name";
list.iSubItem=1;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
list.cx=100;
list.pszText="Address";
list.iSubItem=2;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
list.cx=100;
list.pszText="Country";
list.iSubItem=2;
:
:
SendMessage(hWnd,LVM_INSERTCOLUMN,
(WPARAM)1,(WPARAM)&list);
//InsertsfirstRowwithfourcolumns.
SetCell(hWnd,"1",0,0);
SetCell(hWnd,"Prabhakar",0,1);
SetCell(hWnd,"Hyderabad",0,2);
SetCell(hWnd,"India",0,3);
//InsertssecondRowwithfourcolumns.
SetCell(hWnd,"2",1,0);
SetCell(hWnd,"Uday",1,1);
SetCell(hWnd,"Chennai",1,2);
SetCell(hWnd,"India",1,3);
//InsertsthirdRowwithfourcolumns.
SetCell(hWnd,"3",2,0);
SetCell(hWnd,"Saradhi",2,1);
SetCell(hWnd,"Bangolore",2,2);
SetCell(hWnd,"India",2,3);
//InsertsfourthRowwithfourcolumns.
SetCell(hWnd,"4",3,0);
SetCell(hWnd,"Surya",3,1);
SetCell(hWnd,"Calcutta",3,2);
SetCell(hWnd,"India",3,3);
}
7.AddanotherfunctioncalledSetCell()totheCMultipleColumnsDlgclass
Collapse
CopyCode
voidSetCell(HWNDhWnd1,CStringvalue,intnRow,intnCol);
Inthefunctionhandleraddthefollowingcode
Collapse
CopyCode
//Thisfunctionsetthetextinthespecified
//SubItemdependingontheRowandColumnvalues
voidCMultipleColumnsDlg:
:
SetCell(HWNDhWnd1,
CStringvalue,intnRow,intnCol)
{
TCHARszString[256];
wsprintf(szString,value,0);
//FilltheLVITEMstructurewiththe
//valuesgivenasparameters.
LVITEMlvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nRow;
lvItem.pszText=szString;
lvItem.iSubItem=nCol;
if(nCol>0)
//setthevalueoflistItem
:
:
SendMessage(hWnd1,LVM_SETITEM,
(WPARAM)0,(WPARAM)&lvItem);
else
//InsertthevalueintoList
ListView_InsertItem(hWnd1,&lvItem);
}
8.AddonemorefunctioncalledGetItemText()tothesameClass
Collapse
CopyCode
CStringGetItemText(HWNDhWnd,intnItem,intnSubItem)const;
Insidethefunctionaddthefollowingcode
Collapse
CopyCode
//thisfunctionwillreturnstheitem
//textdependingontheitemandSubItemIndex
CStringCMultipleColumnsDlg:
:
GetItemText(
HWNDhWnd,intnItem,intnSubItem)const
{
LVITEMlvi;
memset(&lvi,0,sizeof(LVITEM));
lvi.iSubItem=nSubItem;
CStringstr;
intnLen=128;
intnRes;
do
{
nLen*=2;
lvi.cchTextMax=nLen;
lvi.pszText=str
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ListCtrl 控件 编辑
![提示](https://static.bingdoc.com/images/bang_tan.gif)