MFC List Control 控件--多列设置、数据插入、整行删除、对整行数据插入操作、对整行数据删除操作

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 <CString>* m_vecMessage = NULL;
	m_vecMessage = new vector <CString>;//定义一个容器,用来存放每一条记录
	//查找数据库,获得数据类表
	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
}

剩下的步骤可以参考插入的步骤,进行编辑

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值