为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ListCtrl控件数据动态修改(List_Control)

2011-12-12 13页 doc 128KB 34阅读

用户头像

is_745732

暂无简介

举报
ListCtrl控件数据动态修改(List_Control) : www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx 另自己写了一篇关于一些ListControl的基本操作(如何获得一项的值,如何选中一行而不是一列等)请查看:hi.baidu.com/anglecloudy/blog/item/d969fd29138093f999250a97.html Editing Sub-Items in List Control By s.prabhakarreddy 本文全面介绍了如何编辑List Control...
ListCtrl控件数据动态修改(List_Control)
: www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx 另自己写了一篇关于一些ListControl的基本操作(如何获得一项的值,如何选中一行而不是一列等)请查看:hi.baidu.com/anglecloudy/blog/item/d969fd29138093f999250a97.html Editing Sub-Items in List Control By s.prabhakarreddy 本文全面介绍了如何编辑List Control里面的任何子项 介绍 内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到List Control,List Control有很多方法可以显示数据,可List Control里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎么实现这个功能。这篇文章是基于VC MFC滴,用别的功具的娃们当然也可以看看,呵呵,不多说,先实现图上ok exit两个按钮: void CMultipleColumnsDlg::OK() { CDialog::EndDialog (0); // Add this line } void CMultipleColumnsDlg::OnExit() { CDialog::EndDialog (0); // Add this line } 接下来添加一个ListCtrl控件,记得把ListCtrl的style设置成Report,这个是为了实现我们要多行显示的功能 然后增加一个文本框Edit Box去掉它的Border style属性 增加一个InsertItems() 成员函数,用来写入ListControl的显示内容 void CMultipleColumnsDlg::InsertItems() { HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1); // Set the LVCOLUMN structure with the required // column information LVCOLUMN list; list.mask = LVCF_TEXT |LVCF_WIDTH| LVCF_FMT |LVCF_SUBITEM; list.fmt = LVCFMT_LEFT; list.cx = 50; list.pszText = "S.No"; list.iSubItem = 0; //Inserts the column ::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); // Inserts first Row with four columns . SetCell(hWnd,"1",0,0); SetCell(hWnd,"Prabhakar",0,1); SetCell(hWnd,"Hyderabad",0,2); SetCell(hWnd,"India",0,3); // Inserts second Row with four columns . SetCell(hWnd,"2",1,0); SetCell(hWnd,"Uday",1,1); SetCell(hWnd,"Chennai",1,2); SetCell(hWnd,"India",1,3); } 自定义的SetCell( ) 函数,用来实现插入数据用的 void CMultipleColumnsDlg::SetCell(HWND hWnd1, CString value, int nRow, int nCol) { TCHAR szString [256]; wsprintf(szString,value ,0); //Fill the LVITEM structure with the //values given as parameters. LVITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = nRow; lvItem.pszText = szString; lvItem.iSubItem = nCol; if(nCol >0) //set the value of listItem ::SendMessage(hWnd1,LVM_SETITEM, (WPARAM)0,(WPARAM)&lvItem); else //Insert the value into List ListView_InsertItem(hWnd1,&lvItem); } //通过行和列得到项目里面的数据 CString CMultipleColumnsDlg::GetItemText( HWND hWnd, int nItem, int nSubItem) const { LVITEM lvi; memset(&lvi, 0, sizeof(LVITEM)); lvi.iSubItem = nSubItem; CString str; int nLen = 128; int nRes; do { nLen *= 2; lvi.cchTextMax = nLen; lvi.pszText = str.GetBufferSetLength(nLen); nRes = (int)::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); str.ReleaseBuffer(); return str; } //为窗口类添加两个成员变量: int nItem, nSubItem; 用Class wizard 添加 NM_CLICK 响应 ,当用户点击任何位置时,就会对应出现一个Edit Box,并可以修改数据 void CMultipleColumnsDlg::OnClickList( NMHDR* pNMHDR, LRESULT* pResult) { Invalidate(); HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST1); LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR; RECT rect; //get the row number nItem = temp->iItem; //get the column number nSubItem = temp->iSubItem; if(nSubItem == 0 || nSubItem == -1 || nItem == -1) return ; //Retrieve the text of the selected subItem //from the list CString str = GetItemText(hWnd1,nItem , nSubItem); RECT rect1,rect2; // this macro is used to retrieve the Rectanle // of the selected SubItem ListView_GetSubItemRect(hWnd1,temp->iItem, temp->iSubItem,LVIR_BOUNDS,&rect); //Get the Rectange of the listControl ::GetWindowRect(temp->hdr.hwndFrom,&rect1); //Get the Rectange of the Dialog ::GetWindowRect(m_hWnd,&rect2); int x=rect1.left-rect2.left; int y=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)); //Draw a Rectangle around the SubItem ::Rectangle(::GetDC(temp->hdr.hwndFrom), rect.left,rect.top-1,rect.right,rect.bottom); //Set the listItem text in the EditBox ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),str); *pResult = 0; } To handle the ENTER key we need to write the virtual function OnOk (响应ENTER键) afx_msg void OnOK(); In MultipleColumnsDlg.cpp write the following code. // This function handles the ENTER key void CMultipleColumnsDlg::OnOK() { CWnd* pwndCtrl = GetFocus(); // get the control ID which is // presently having the focus int ctrl_ID = pwndCtrl->GetDlgCtrlID(); CString str; switch (ctrl_ID) { //if the control is the EditBox case IDC_EDIT1: //get the text from the EditBox GetDlgItemText(IDC_EDIT1,str); //set the value in the listContorl with the //specified Item & SubItem values 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 中设置List Control的样式 ListView_SetExtendedListViewStyle(::GetDlgItem (m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); InsertItems(); ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE); Introduction Almost every one of us who are programming in VC++ , will come across the List control. There are many cases where there is a need to represent data in List Control in multiple columns. By default it is not possible to modify the data in the List control itself. In this small article I am putting a simple way to edit any value in any column in a Report style List control. The logic here is simple, whenever user clicks on an sub-item which he wants to modify at that place I am displaying a edit box and allowing to modify the value. Once modified and by clicking the ENTER key, the updated value is set in the List control. Here I am assuming the user is familiar with VC++ and using Class Wizard Implementation steps: 1. Using MFC AppWizard, create a Dialog Based application. Give the application name as MultipleColumns. By default the wizard adds OK and Cancel buttons to the Dialog, Remove these two buttons. 2. Now Add a List-Control and in properties change the style to Report, this style is necessary if we want multiple columns 3. Add two buttons to the Dialog and name them as OK and Exit 4. Add one Edit box and in the properties remove the Border style 5. Using the Class Wizard add the message handlers for the OK and Exit Buttons. Add the following code to those functions Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code void CMultipleColumnsDlg::OK() { CDialog::EndDialog (0); // Add this line } Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code void CMultipleColumnsDlg::OnExit() { CDialog::EndDialog (0); // Add this line } 6. Add a function called InsertItems() to the CMulipleColumnsDlg class. Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code void InsertItems(); In the function handler add the following code Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code // This function inserts the default values // into the listControl void CMultipleColumnsDlg::InsertItems() { HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1); // Set the LVCOLUMN structure with the required // column information LVCOLUMN list; list.mask = LVCF_TEXT |LVCF_WIDTH| LVCF_FMT |LVCF_SUBITEM; list.fmt = LVCFMT_LEFT; list.cx = 50; list.pszText = "S.No"; list.iSubItem = 0; //Inserts the column ::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); // Inserts first Row with four columns . SetCell(hWnd,"1",0,0); SetCell(hWnd,"Prabhakar",0,1); SetCell(hWnd,"Hyderabad",0,2); SetCell(hWnd,"India",0,3); // Inserts second Row with four columns . SetCell(hWnd,"2",1,0); SetCell(hWnd,"Uday",1,1); SetCell(hWnd,"Chennai",1,2); SetCell(hWnd,"India",1,3); // Inserts third Row with four columns . SetCell(hWnd,"3",2,0); SetCell(hWnd,"Saradhi",2,1); SetCell(hWnd,"Bangolore",2,2); SetCell(hWnd,"India",2,3); // Inserts fourth Row with four columns . SetCell(hWnd,"4",3,0); SetCell(hWnd,"Surya",3,1); SetCell(hWnd,"Calcutta",3,2); SetCell(hWnd,"India",3,3); } 7. Add another function called SetCell( ) to the CMultipleColumnsDlg class Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code void SetCell(HWND hWnd1, CString value, int nRow, int nCol); In the function handler add the following code Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code // This function set the text in the specified // SubItem depending on the Row and Column values void CMultipleColumnsDlg::SetCell(HWND hWnd1, CString value, int nRow, int nCol) { TCHAR szString [256]; wsprintf(szString,value ,0); //Fill the LVITEM structure with the //values given as parameters. LVITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = nRow; lvItem.pszText = szString; lvItem.iSubItem = nCol; if(nCol >0) //set the value of listItem ::SendMessage(hWnd1,LVM_SETITEM, (WPARAM)0,(WPARAM)&lvItem); else //Insert the value into List ListView_InsertItem(hWnd1,&lvItem); } 8. Add one more function called GetItemText() to the same Class Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code CString GetItemText(HWND hWnd, int nItem, int nSubItem) const; Inside the function add the following code Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code //this function will returns the item //text depending on the item and SubItem Index CString CMultipleColumnsDlg::GetItemText( HWND hWnd, int nItem, int nSubItem) const { LVITEM lvi; memset(&lvi, 0, sizeof(LVITEM)); lvi.iSubItem = nSubItem; CString str; int nLen = 128; int nRes; do { nLen *= 2; lvi.cchTextMax = nLen; lvi.pszText = str.GetBufferSetLength(nLen); nRes = (int)::SendMessage(hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); str.ReleaseBuffer(); return str; } 9. Also add two member variables to the CMultipleColumnsDlg class which are of type int Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code int nItem, nSubItem; 10. From the Class wizard add NM_CLICK notification to the List control. Inside the function handler write the following code Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code //This function Displays an EditBox at the position //where user clicks on a particular SubItem with //Rectangle are equal to the SubItem, thus allows to //modify the value void CMultipleColumnsDlg::OnClickList( NMHDR* pNMHDR, LRESULT* pResult) { Invalidate(); HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST1); LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR; RECT rect; //get the row number nItem = temp->iItem; //get the column number nSubItem = temp->iSubItem; if(nSubItem == 0 || nSubItem == -1 || nItem == -1) return ; //Retrieve the text of the selected subItem //from the list CString str = GetItemText(hWnd1,nItem , nSubItem); RECT rect1,rect2; // this macro is used to retrieve the Rectanle // of the selected SubItem ListView_GetSubItemRect(hWnd1,temp->iItem, temp->iSubItem,LVIR_BOUNDS,&rect); //Get the Rectange of the listControl ::GetWindowRect(temp->hdr.hwndFrom,&rect1); //Get the Rectange of the Dialog ::GetWindowRect(m_hWnd,&rect2); int x=rect1.left-rect2.left; int y=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)); //Draw a Rectangle around the SubItem ::Rectangle(::GetDC(temp->hdr.hwndFrom), rect.left,rect.top-1,rect.right,rect.bottom); //Set the listItem text in the EditBox ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),str); *pResult = 0; } 11. To handle the ENTER key we need to write the virtual function OnOk in the MultipleColumnsDlg.h, so add the following as protected member Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code afx_msg void OnOK(); In MultipleColumnsDlg.cpp write the following code. Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code // This function handles the ENTER key void CMultipleColumnsDlg::OnOK() { CWnd* pwndCtrl = GetFocus(); // get the control ID which is // presently having the focus int ctrl_ID = pwndCtrl->GetDlgCtrlID(); CString str; switch (ctrl_ID) { //if the control is the EditBox case IDC_EDIT1: //get the text from the EditBox GetDlgItemText(IDC_EDIT1,str); //set the value in the listContorl with the //specified Item & SubItem values 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; } } 12. The last step in the implementation is add the following code in side the OnInitDialog function Collapse HYPERLINK "http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx" \l "#" Copy Code //Set the style to listControl ListView_SetExtendedListViewStyle(::GetDlgItem (m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); InsertItems(); ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
/
本文档为【ListCtrl控件数据动态修改(List_Control)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索