MFC列表控件ListCtrl如图:
列表控件ListCtrl样式属性(风格)有:
Icon大图标,SmallIcon小图标、List列表、Report报告 ,但今天只谈Report报告样式:
1.
(1)InsertItem --- 插入一个主项(行)
(2)DeleteItem --- 删除一个主项 (行)
(3)InsertColumn --- 插入一个列
(4)DeleteColumn --- 删除一个列 (索引从0开始)
(5)SetItemText --- 设置子项文本
(6)GetItemText --- 获得子项文本
(7)GetItemCount --- 获得项目的总数(总行数目)
(8)SetImageList --- 把图像列表与列表控件关联(设置列表图标需要)
-------------------------------------------------------
用法:
(1)InsertItem() //插入一行
// 可以插入图片(失败则图片不能显示)
int InsertItem(const LVITEM* pItem);
// 插入文字
int InsertItem(
int nItem, //第几行
LPCTSTR lpszItem //该行第1列的文字
);
-------------------------------------------------------
(2)DeleteItem(iItem); //根据行号删除某行。
注意:若要删除多行时,需要从后面开始删除,因为如果从前面开始删除的话,下面的行会往上移,原来第1行就变成了第0行。
错误删法:
m_listctrl.DeleteItem(0);
m_listctrl.DeleteItem(1)
正确删法:
m_listctrl.DeleteItem(1);
m_listctrl.DeleteItem(0);
-------------------------------------------------------
(3)InsertColumn() //插入1列
int InsertColumn(
int nCol, // 第几列
LPCTSTR lpszColumnHeading, //列名
int nFormat = LVCFMT_LEFT, // 对齐的方式
int nWidth = -1, //该列的宽度
int nSubItem = -1 //子项的索引与列(一般缺省默认即可,可不填)
);
对齐的方式有3种:
LVCFMT_LEFT (左对齐)
LVCFMT_CENTER (居中)
LVCFMT_RIGHT (右对齐)
-------------------------------------------------------
(4)DeleteColumn --- 删除一个列 (索引从0开始)
//注意:删除多列要从后往前删,否则出错
for(int k=2;k>=0;k--)
m_ListCtrl.DeleteColumn(k);
-------------------------------------------------------
(5)SetItemText() //设置文字
BOOL SetItemText(
int nItem, //第几行
int nSubItem, //低级列
LPCTSTR lpszText //文字内容
);
-------------------------------------------------------
2.设置列表控件的扩展样式
SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES) ;
常用的扩展样式:
LVS_EX_GRIDLINES---网格线
LVS_EX_CHECKBOXES---每一行的最前面带个复选框
LVS_EX_FULLROWSELECT---整行选中
LVS_EX_HEADERDRAGDROP---列表头可以拖动(改变位置)
1.如图,布局界面
2.关联变量
“备注”编辑框ID改为:IDC_EDIT_DATA5
“总数”编辑框ID改为:IDC_EDIT2_TOTAL
3.在对话框初始化函数OnInitDialog()中设置列表控件的风格、插入表头、设置列宽等
代码如下:
BOOL CTestListCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//XXXXXX
//默认代码
//XXXXXX
// TODO: Add extra initialization here
EnableWindowSet(FALSE); //默认某些按钮初始化为禁用
//属性:网格线、整行选中、CheckBox、列表头可以拖动(改变位置)
m_ListData.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES |LVS_EX_HEADERDRAGDROP);
//插入表头/列名
m_ListData.InsertColumn(0,_T("日期"),LVCFMT_CENTER);
m_ListData.InsertColumn(1,_T("星期"),LVCFMT_CENTER);
m_ListData.InsertColumn(2,_T("时间"),LVCFMT_CENTER);
m_ListData.InsertColumn(3,_T("Data1"),LVCFMT_CENTER);
m_ListData.InsertColumn(4,_T("Data2"),LVCFMT_CENTER);
m_ListData.InsertColumn(5,_T("Data3"),LVCFMT_CENTER);
m_ListData.InsertColumn(6,_T("Data4"),LVCFMT_CENTER);
m_ListData.InsertColumn(7,_T("备注"),LVCFMT_CENTER);
//设置列宽
m_ListData.SetColumnWidth(0,80);
m_ListData.SetColumnWidth(1,80);
m_ListData.SetColumnWidth(2,80);
m_ListData.SetColumnWidth(3,95);
m_ListData.SetColumnWidth(4,95);
m_ListData.SetColumnWidth(5,95);
m_ListData.SetColumnWidth(6,95);
m_ListData.SetColumnWidth(7,80);
if (m_ListData.GetItemCount()<=0)
{
//总数默认为0
GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(_T("0"));
}
return TRUE; // return TRUE unless you set the focus to a control
}
4.为按钮“插入数据”添加单击事件:
void CTestListCtrlDlg::OnButtonInsert()
{
EnableWindowSet(TRUE); //启用右边按钮等控件
}
EnableWindowSet函数:
//禁用或启用相关控件
void CTestListCtrlDlg:: EnableWindowSet(BOOL show)
{
if (show)
{
GetDlgItem(IDC_STATIC1)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC2)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC3)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC4)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(TRUE);
GetDlgItem(IDC_Tip)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_OK)->EnableWindow(TRUE);
}else{
GetDlgItem(IDC_STATIC1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DATA1)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DATA2)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC3)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DATA3)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC4)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DATA4)->EnableWindow(FALSE);
GetDlgItem(IDC_Tip)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_DATA5)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_ENSURE_INSERT)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_OK)->EnableWindow(FALSE);
}
}
//确定插入数据
void CTestListCtrlDlg::OnButtonEnsureInsert()
{
//或取系统时间
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
//年月日
CString strDate;
strDate.Format(_T("%d/%d/%d"),SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay);
//星期
CString strDayOfWeek;
switch(SystemTime.wDayOfWeek) {
case 1 :strDayOfWeek = _T("星期一");
break;
case 2 :strDayOfWeek = _T("星期二");
break;
case 3 :strDayOfWeek = _T("星期三");
break;
case 4 :strDayOfWeek = _T("星期四");
break;
case 5 :strDayOfWeek = _T("星期五");
break;
case 6 :strDayOfWeek = _T("星期六");
break;
case 7 :strDayOfWeek = _T("星期日");
break;
default:;
}
//从右侧编辑框中获取输入的数据,再插入到列表框中
CString TempmData1;
CString TempmData2;
CString TempmData3;
CString TempmData4;
CString TempmData5;
GetDlgItem(IDC_EDIT_DATA1)->GetWindowText(TempmData1);
GetDlgItem(IDC_EDIT_DATA2)->GetWindowText(TempmData2);
GetDlgItem(IDC_EDIT_DATA3)->GetWindowText(TempmData3);
GetDlgItem(IDC_EDIT_DATA4)->GetWindowText(TempmData4);
GetDlgItem(IDC_EDIT_DATA5)->GetWindowText(TempmData5);
int Num = m_ListData.GetItemCount();//获取项目的总数(总行数目)
CString str;
str.Format(_T(" %d"),Num+1);
GetDlgItem(IDC_EDIT2_TOTAL)->SetWindowText(str);
TempmData5+=str;
//插入数据 注意:ListView控件第一列无法居中,如果需要第一列居中,则第一列宽度设为0,从第二开始使用。
CString strTime;
strTime.Format(_T("%2d:%02d:%2d"),SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond);
m_ListData.InsertItem(0,strDate);//插入一个主项(行) 并将数据(日期)写入第一列
m_ListData.SetItemText(0,1,strDayOfWeek);//设置子项文本:星期
m_ListData.SetItemText(0,2,strTime); //时间
m_ListData.SetItemText(0,3,TempmData1);
m_ListData.SetItemText(0,4,TempmData2);
m_ListData.SetItemText(0,5,TempmData3);
m_ListData.SetItemText(0,6,TempmData4);
m_ListData.SetItemText(0,7,TempmData5);
CString strWarn;
strWarn = m_ListData.GetItemText(0, 7);//获得子项文本:第一行第7个内容
//AfxMessageBox(strWarn);
GetDlgItem(IDC_EDIT_DATA5)->SetWindowText(_T(""));//清空备注
UpdateData(FALSE);
}
6.“完成”按钮:
void CTestListCtrlDlg::OnButtonOk()
{
EnableWindowSet(FALSE); //禁用右边按钮等控件
}
运行,点击“插入数据”按钮,右边控件启用,输入数据及备注,点击插入即可完成数据的插入:
注意:表头有复选框是因为初始化时,LVS_EX_CHECKBOXES 风格的作用:
m_ListData.SetExtendedStyle(
LVS_EX_GRIDLINES|
LVS_EX_FULLROWSELECT|
LVS_EX_CHECKBOXES //复选框
7.增加“全选”,“反选”,“全不选”功能:
添加3个单选框radio,通过类向导为其添加点击事件:
“全选”:
void CTestListCtrlDlg::OnRADIO_AllSELECT()
{
for (int i=0;i
“反选”
void CTestListCtrlDlg::OnRadio_Unselect()
{
BOOL state;
for (int i=0;i
“全不选”
void CTestListCtrlDlg::OnRADIO_AllNOSELECT()
{
for (int i=0;i
8.增加“删除选中”功能:
void CTestListCtrlDlg::OnButtonDeletedata()
{
int nItem;
POSITION pos;
while (pos = m_ListData.GetFirstSelectedItemPosition())
{
nItem = -1;
nItem = m_ListData.GetNextSelectedItem(pos);
if (nItem >= 0 && m_ListData.GetSelectedCount() > 0)
{
m_ListData.DeleteItem(nItem);
CString strNum1;
strNum1.Format(_T("%d"),nItem+1);
// AfxMessageBox(strNum1);
int i=m_ListData.GetSelectionMark();//获得选中行的行标
// m_ListData.SetSelectionMark(-1);//取消选中行
CString strNum;
strNum.Format(_T("%d"),i);
GetDlgItem(IDC_EDIT_LINENUM)->SetWindowText(strNum) ;
//m_List.GetItemState();//从后向前遍历数据,获取被选中行的行号iItem
}
}
}
运行,插入数据:
点击“删除选中”
可同时删除多行:
点击“删除选中”: