MFC 当列表控件为Report报表形式时,怎样实现修改表格数据
2017-04-26 09:32
351 查看
//声明:本文例子是双击任意位置处的表格数据,实现对当前位置的单元格数据进行修改
并且为该对话框添加一个新类,为CDialogModifyDrillItem,并为该编辑框关联一个CString类型的成员变量m_strNewValue
记录存到历史表中去,然后再更新显示表中对应字段的值,因此这里还涉及到一个问题,就是获取鼠标双击的单元格所对应的类字段名称,因为在更新显示表对应字段值时需要 用到该字段的名称,故有这么一个过程,代码下面有详细说明:
由于项目的保密性,有些代码已经省略,省略代码位置都有说明:
//当用户在列表控件中双击鼠标左键触发该事件,该事件的主要作用是双击某项修改其值
void CDialogQueryDrillVerTree::OnNMDblclkListtabledata(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (pNMItemActivate->iItem == -1) //若用户鼠标双击没有点在列表控件位置,则提示错误信息
{
AfxMessageBox("你没有点击任何项目!");
}
else
{
CString bhid=m_list_tabledata.GetItemText(pNMItemActivate->iItem,0);//pNMItemActivate->iItem代表鼠标双击位置的行号,pNMItemActivate->iSubItem为鼠标双击位置的列号,
//而且列表控件的扩展样式必须设为LVS_EX_FULLROWSELECT,即满行选中,这样才能点击一行的任意列都可以获取正确的行号,再根据行号获取BHID字段
//AfxMessageBox(bhid);
//修改之前先将原始记录值插入到对应的历史表中去,对应代码已经省略
//这里省略将该记录插入到历史表中去代码
//.................//
修改成功!
备注:若前面列表控件的扩展样式不设置为满行选中,则双击任意一个单元格时获取不到该单元格所在行的行号,所以如果不设置就会有问题。
1.首先是实现在列表控件中显示表格数据,具体代码这里不描述,显示效果如下图:
2.现要实现如声明所说的功能,就是双击某个单元格弹出一个对话框输入新值,再用新值去替换原值:
1>重要步骤,一定要将列表控件扩展样式设为满行选中,如LVS_EX_FULLROWSELECT样式,如果不设为这个样式,后面会出问题,m_list_tabledata是列表控件所关联的控件变量,LVS_EX_GRIDLINES是如上图所设置的网格样式,代码如下:
m_list_tabledata.SetExtendedStyle(m_list_tabledata.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);//设置列表控件的延展属性为“满行选中和网格”2>插入一个对话框资源,设计界面如下图所示:
并且为该对话框添加一个新类,为CDialogModifyDrillItem,并为该编辑框关联一个CString类型的成员变量m_strNewValue
3>为列表控件添加鼠标双击事件,即NM_DBLCLK事件,整个事件响应函数代码如下:
这里的LPNMITEMACTIVATE结构体中的iItem代表鼠标双击位置的行号,iSubItem为鼠标双击位置的列号,由于本人做的是数据库开发,再修改某条记录之前需要先将这条记录存到历史表中去,然后再更新显示表中对应字段的值,因此这里还涉及到一个问题,就是获取鼠标双击的单元格所对应的类字段名称,因为在更新显示表对应字段值时需要 用到该字段的名称,故有这么一个过程,代码下面有详细说明:
由于项目的保密性,有些代码已经省略,省略代码位置都有说明:
//当用户在列表控件中双击鼠标左键触发该事件,该事件的主要作用是双击某项修改其值
void CDialogQueryDrillVerTree::OnNMDblclkListtabledata(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (pNMItemActivate->iItem == -1) //若用户鼠标双击没有点在列表控件位置,则提示错误信息
{
AfxMessageBox("你没有点击任何项目!");
}
else
{
CString bhid=m_list_tabledata.GetItemText(pNMItemActivate->iItem,0);//pNMItemActivate->iItem代表鼠标双击位置的行号,pNMItemActivate->iSubItem为鼠标双击位置的列号,
//而且列表控件的扩展样式必须设为LVS_EX_FULLROWSELECT,即满行选中,这样才能点击一行的任意列都可以获取正确的行号,再根据行号获取BHID字段
//AfxMessageBox(bhid);
//修改之前先将原始记录值插入到对应的历史表中去,对应代码已经省略
//这里省略将该记录插入到历史表中去代码
//.................//
CDialogModifyDrillItem m_dlgModify;//弹出CDialogModifyDrillItem对话框,用于接收用户所修改的值 if (m_dlgModify.DoModal()==IDOK)//如果m_dlgModify对话框点击了确定按钮 { m_list_tabledata.SetItemText(pNMItemActivate->iItem,pNMItemActivate->iSubItem,m_dlgModify.m_strNewValue);//pNMItemActivate->iSubItem为鼠标双击位置的列号,此语句的作用是根据行列号用m_strNewValue(用户修改的新值)代替原值 /**********************获取鼠标双击位置的列字段名称,开始****************************/ //pColumn,指定信息检索 LVCOLUMN 结构的地址和获取有关列的信息。 mask 成员指定检索哪些列属性。 如果 mask 成员指定 LVCF_TEXT 值,pszText 成员必须包含接收项文本,并 cchTextMax 成员必须指定缓冲区的大小缓冲区的地址。 LVCOLUMN col; CString ziduan;//存储所获取到的列字段名称 col.mask=LVCF_TEXT;//设置mask成员指定LVCF_TEXT值 col.cchTextMax=100;//并 cchTextMax 成员必须指定缓冲区的大小缓冲区的地址。 col.pszText =ziduan.GetBuffer(100);//pszText成员必须包含接收项文本(即为ziduan字符串) if(m_list_tabledata.GetColumn(pNMItemActivate->iSubItem,&col))//获取鼠标双击位置所在列的表头列字段信息 { ziduan=col.pszText; //AfxMessageBox(ziduan);//测试用 } ziduan.ReleaseBuffer();//释放 /**********************获取鼠标双击位置的列字段名称,结束****************************/
//这里更新现实表中对应字段的新值,代码已经省略
//此处代码已经省略............// AfxMessageBox("修改成功!"); } } *pResult = 0; }
4>效果如下图:
修改成功!
备注:若前面列表控件的扩展样式不设置为满行选中,则双击任意一个单元格时获取不到该单元格所在行的行号,所以如果不设置就会有问题。
相关文章推荐
- 解决WinForm中ComboBox控件的“设置"DataSourse”属性后无法修改项集合”以及两个不相关联的ComboxBox控件实现数据列表显示不可实现的问题
- VC++列表控件Report报表样式初始化及添加数据基本方法
- 利用RFT+VBS实现对表格控件的数据录入
- 数据窗口(实现只能修改grid列表中某一列)
- 使用Jquery实现可编辑的表格 并使用AJAX提交到服务器修改数据
- Java实现的自定义可编辑表格控件(支持汇总、滚动、增行、删行、小数、日期、下拉列表、参照等)
- 数据以报表形式展现的实现方法研究
- 用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
- 实现类型化的数据绑定(列表)控件
- 数据以报表形式展现的实现方法研究
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- 数据以报表形式展现的实现方法研究
- 用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
- WPF 怎样实现单选列表控件?
- ajax实现在直接在表格中修改数据
- 基于Ajax技术实现的数据表格控件
- 使用Jquery实现可编辑的表格 并使用AJAX提交到服务器修改数据
- reportviewer 控件动态绑定数据 报表灵活绑定数据
- Repeater控件实现点击列表行单元格.在该行下方显示数据
- .net 中怎样利用数据控件,同行数据输出两种样式的列表