控制单元格是否可以编辑,或者是否保存或放弃修改的方法有好几种。
最简单的方法就是使用SetEditable(BOOL)。这个函数决定了Grid中的单元格是否可以编辑。可以通过在特定单元格中使用GVIS_READONLY来实现更好的控制。
int row = 1;
int col = 10;
m_Grid.SetItemState(row,col, m_Grid.GetItemState(row,col) | GVIS_READONLY);
深层的控制可以通过处理GVN_BEGINLABELEDIT消息来实现。如果消息的返回值小于0,那么试图对指定单元格所做的修改将被取消同时,这个单元格将被看作是只读属性的。当每次试图编辑某一个单元格时都会发送一个这种消息。
为处理这个消息,需要在主窗口中增加一个句柄:
BEGIN_MESSAGE_MAP(CGridCtrlDemoDlg, CDialog) ...
// 增加句柄
ON_NOTIFY(GVN_ENDLABELEDIT, IDC_GRID, OnGridEndEdit)
END_MESSAGE_MAP()
...
// GVN_ENDLABELEDIT
void CGridCtrlDemoDlg::OnGridStartEdit(NMHDR *pNotifyStruct,
LRESULT* pResult) {
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
// 如果你允许对单元格进行编辑,那么虚构函数AllowCellToBeEdited将返回TRUE
BOOL bAllowEdit = AllowCellToBeEdited(pItem->iRow, pItem->iColumn);
*pResult = (bAllowEdit)? 0 : -1; }
可以通过相同的方法处理GVN_ENDLABELEDIT消息来实现是保存还是放弃对单元格的编辑行为。
// GVN_ENDLABELEDIT
void CGridCtrlDemoDlg::OnGridEndEdit(NMHDR *pNotifyStruct,
LRESULT* pResult) {
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
// 如果你想保存对单元格的修改,那么虚构函数AcceptChange将返回TRUE
BOOL bAcceptChange = AcceptChange(pItem->iRow, pItem->iColumn);
*pResult = (bAcceptChange)? 0 : -1; }
你所能用的最终的确认方法是源于CGridCellBase类,并重载ValidateEdit方法的。如果它返回的是TRUE,那么表示保存修改,否则表示放弃修改。
声名
如果没有下面这些作者的免费代码,这些工作将不会成功。
Joe Willcoxson:我的工作依赖于 Joe的原始代码,它提供了这个控件的基本结构。
Keith Rule:Keith有一个很灵巧的类CMemDC,它能很容易的处理闪烁显示工作。他还提供了copy/paste/drag/drop对象源代码。
Ravi Reddy:我使用了Ravi的一个列表浏览打印代码。
Zafir Anjum:他为我提供了CInPlaceEdit的切入点,并且提供了排序程序和标题提示的源代码。
Eric Woodruff, Brian V. Shifrin, Scot Reed, Aqiruse, Ken Bertelson, Martin Daly帮助我把控件升级到2.X版本--还有很多在以前版本中提供帮助的人。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库CGridCtrl学习指南(5)在线全文阅读。
相关推荐: