tips:使用list Control控件的目的是:让数据进行多列展示。这里有一个需要注意:不能使用list Box,List Box 的多列展示,是指数据在一列展示不完的前提下,折叠到第二列进行展示。
1.多列设置
设置多个列头,类似平时我们word中所用列表的列头。
void knowledgeBaseDlg::AddCols(UINT id)
{
CRect rect;
CWnd *wnd = NULL;
wnd = GetDlgItem(id);
if (NULL == wnd)
{
MessageBox(_T("相应控件不存在"));
}
wnd->GetWindowRect(&rect);
ScreenToClient(&rect);
int width = ((int)rect.right - (int)rect.left) / 5;
m_list.InsertColumn(0, _T("跨径长度"), LVCFMT_CENTER, width, -1);// 插入列
m_list.InsertColumn(1, _T("参数名称"), LVCFMT_CENTER, width, -1);
m_list.InsertColumn(2, _T("变量类型"), LVCFMT_CENTER, width, -1);
m_list.InsertColumn(3, _T("变量值"), LVCFMT_CENTER, width, -1);
m_list.InsertColumn(4, _T("变量代号"), LVCFMT_CENTER, width, -1);
}
解释:1.在自己编辑的dialog中拖入list control控件
2.为控件定义一个control类型的变量,名为m_list
3.定义设置列头的函数,名为 AddCols(UINT id); id为当前编辑list control控件的id值。
4.利用InsertColumn()函数,进行列头的设置,第一个参数代表列索引号,第二个代表你要填入列中的字符串,第三个代表字符串居中模式,该列的宽度。
tips:本文对列宽的设置,是对整个list的宽度求平均。也可以自行设置。可将
2.数据插入
在已有列头的前提下,对每个列中插入相应的数据。
void knowledgeBaseDlg::AddNewRols()
{
vector * m_vecMessage = NULL;
m_vecMessage = new vector ;//定义一个容器,用来存放每一条记录
//查找数据库,获得数据类表
m_vecMessage->push_back(_T("6"));
m_vecMessage->push_back(_T("台宽"));
m_vecMessage->push_back(_T("公式"));
m_vecMessage->push_back(_T("M+100"));
m_vecMessage->push_back(_T("tdb"));
//NormalMessageVector(A2W(sTempVaule.c_str()), m_vecMessage);
for (int i = 0; i < 10; ++i)
{
m_list.InsertItem(i, m_vecMessage->at(0));//插入行
m_list.SetItemText(i, 1, m_vecMessage->at(1));
m_list.SetItemText(i, 2, m_vecMessage->at(2));
m_list.SetItemText(i, 3, m_vecMessage->at(3));
m_list.SetItemText(i, 4, m_vecMessage->at(4));
}
}
解释:1.定义数据插入函数名为:AddNewRols()
2.借助InsertItem()和SetItemText()对当前行进行数值插入。其中InsertItem()是插入新的一行的。SetItemText()是对新插入的这一行进行每列值的输入。这两个函数前两个参数代表第i行,第j列,第三个参数代表所要输入的数据值。这里数据值的类型为Cstring。
3.整行删除
void knowledgeBaseDlg::OnMenu1DeleteARow()
{
// TODO: 在此添加命令处理程序代码
////删除整行选中的===============
int count = m_list.GetSelectedCount();
if(count > 0)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
while (pos != NULL)
{
int delId = m_list.GetNextSelectedItem(pos);
m_list.DeleteItem(delId);
}
}
}
解释:本文的做法是为list control控件添加一个菜单。在菜单中分别加入:删除、插入、编辑三个子菜单。
1.首先在资源视图下加入一个Menu按钮。
2.在当前菜单下加入三个删除、插入、编辑三个子菜单。并分别为每个子菜单添加事件处理程序
3.在删除事件处理程序中,完成,查找当前所点击的行的索引值,再按照索引值进行删除的操作。
4.整行插入值
整行插入值,也就是插入当前行的每一列。本文具体操作的核心思想是,当进行插入、编辑操作时,进入到新的对话框,进行变量获取,从子对话框输入的值,直接存入到父对话框中,完成对列表中数值的编辑。
a.首先,添加新的dialog,在新的对话框中设计界面,设计所需要输入的变量,为每一个变量设计一个edit控件,并为每一edit控件添加一个CString类型的值。
b.在新的dialog中添加ok按钮,在ok按钮中,完成从编辑框取值,再将取到的值插入到父对话框中的list列表中去。
void ZSKInsert::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码 CEdit len;CEdit name;CEdit type;CEdit value;CEdit tag;
knowledgeBaseDlg * parent = (knowledgeBaseDlg*)GetParent();
int nNowRow = parent->m_list.GetSelectedCount();//获取父列表当前被选中的列序号
CString len = L"", name = L"", type = L"", value = L"", tag = L"";
GetDlgItemText(IDC_EDIT1, len);//获取用户输入的内容
GetDlgItemText(IDC_EDIT2, name);
GetDlgItemText(IDC_EDIT3, type);//获取用户输入的内容
GetDlgItemText(IDC_EDIT4, value);
GetDlgItemText(IDC_EDIT5, tag);//获取用户输入的内容
int nRow = parent->m_list.InsertItem(nNowRow, len);//插入的是某行的首列位置,返回的是该行的位置。
parent->m_list.SetItemText(nRow, 1, name);//写入某行第二列内容信息
parent->m_list.SetItemText(nRow, 2, type);//写入某行第二列内容信息
parent->m_list.SetItemText(nRow, 3, value);//写入某行第二列内容信息
parent->m_list.SetItemText(nRow, 4, tag);//写入某行第二列内容信息
CDialogEx::OnOK();
}
c.为父对话框中的菜单中的子菜单-插入的事件响应程序引入子对话框这个实例,并将子对话框进行展示。
void knowledgeBaseDlg::OnMenu2InsertARow()
{
// TODO: 在此添加命令处理程序代码
ZSKInsert* dlg = new ZSKInsert();
dlg->Create(IDD_ZSKInsert_DIALOG, this);
dlg->ShowWindow(SW_SHOW);
}
5.对选中行进行编辑
这一项和整行插入相比,只多了一部分,就是将选中行的值展示在新的dialog的编辑框中。
如何将选中行的值展示在子对话框中,需要以下几步:1.在编辑菜单的事件处理函数中,获取当前所选取行的值,并将这些值传入到子对话框对象中;
void knowledgeBaseDlg::OnMenu3EditARow()
{
// TODO: 在此添加命令处理程序代码
CString len = _T(""), name = _T(""), type = _T(""), value = _T(""), tag = _T("");
//1.获取list当前所指向的行编号
//2.获得该行下的每一个str
//3.将获得的str传递给子窗口
int nowRow = m_list.GetSelectedCount();
len = m_list.GetItemText(nowRow, 0);
name = m_list.GetItemText(nowRow, 1);
type = m_list.GetItemText(nowRow, 2);
value = m_list.GetItemText(nowRow, 3);
tag = m_list.GetItemText(nowRow, 4);
ZSKInsert* dlg = new ZSKInsert();
dlg->m_len = len;
dlg->m_name = name;
dlg->m_tag = tag;
dlg->m_type = type;
dlg->m_value = value;
dlg->Create(IDD_ZSKInsert_DIALOG, this);
dlg->ShowWindow(SW_SHOW);
}
2.在子对话框中的OnInitial()函数中,完成将值显示在编辑对话框中。
BOOL ZSKInsert::OnInitDialog()
{
CDialogEx::OnInitDialog();
//在子对话框中为每个编辑框添加变量
//将父对话框传入到子对话框的值显示出来
// TODO: 在此添加额外的初始化
SetDlgItemText(IDC_EDIT1, m_len);
SetDlgItemText(IDC_EDIT2, m_name);
SetDlgItemText(IDC_EDIT3, m_type);
SetDlgItemText(IDC_EDIT4, m_value);
SetDlgItemText(IDC_EDIT5, m_tag);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
剩下的步骤可以参考插入的步骤,进行编辑