首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

CListCtrl单击事件获得行号的有关问题

2012-02-10 
CListCtrl单击事件获得行号的问题以下是我的单击事件代码:void COnOffListViewDlg::OnClickOnoffList(NMHD

CListCtrl单击事件获得行号的问题
以下是我的单击事件代码:
void COnOffListViewDlg::OnClickOnoffList(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
NMLISTVIEW* pNMListView=(NMLISTVIEW*)pNMHDR;
int nRow=pNMListView->iItem;
int nCol=pNMListView->iSubItem;
if (nCol==TOTAL_COLUMN-1)
{
int res=actionDlg.DoModal();
if (res==IDOK)
{
onOffList->SetItemText(nRow,nCol,theApp.strAction);
}
}
*pResult = 0;
}
无论怎么单击,nRow总是-1,不知道怎么回事?
跟List的风格有没有关系,我设置的List风格为:
onOffList->SetExtendedStyle(LVS_EX_GRIDLINES);

[解决办法]
我好像以前也遇到过,不记得怎么解决的了,不过如果改用GetFirstSelectedItemPosition和GetNextSelectedItem取肯定没问题
[解决办法]
DWORD dwPos = GetMessagePos();
POINTS points;
points = MAKEPOINTS(dwPos);
CPoint point ;
point.x = points.x;
point.y = points.y;
m_listProduct.ScreenToClient(&point);
LVHITTESTINFO lvh;
ZeroMemory(&lvh,sizeof LVHITTESTINFO );
lvh.pt = point;
//m_listProduct.HitTest(&lvh);
m_listProduct.SendMessage(LVM_SUBITEMHITTEST ,(WPARAM)0,(LPARAM)&lvh);
if(lvh.iItem < 0)return;

if(lvh.iSubItem == 4)//修改出库数量。
{
CModifyNumDlg dlg;
CString str = m_listProduct.GetItemText(lvh.iItem,4);
dlg.m_iNum = atoi(str);
if(dlg.DoModal() == IDOK)
{
str.Format("%d",dlg.m_iNum);
m_listProduct.SetItemText(lvh.iItem,4,str);
}

}
if(lvh.iSubItem == 7)//修改生产车间。
{
CSelectDepartDlg dlg;
if(dlg.DoModal() == IDOK)
{
m_listProduct.SetItemText(lvh.iItem,7,dlg.m_strDepartName);
m_listProduct.SetItemText(lvh.iItem,1,dlg.m_strDepartID);
}
}

*pResult = 0;
[解决办法]
POSITION ps;
int nIndex;
ps = m_List.GetFirstSelectedItemPosition();
nIndex = m_List.GetNextSelectedItem(ps);
if(nIndex == -1) //没有选择
return;

nIndex就是第一个选择的行索引
[解决办法]

请问,你的控件中有数据吗?
[解决办法]
...item是空的 行号当然是-1。。。
[解决办法]

告诉你一个简单的方法:

1、先手动加入一、二条数据,用 InsertItem ,不要通过数据库加

2、测试单击事件,看看返回值多少?



有时候,好几个问题混在一起,就很难解决;所以,可以先把问题简单话,一个一个独立解决,然后再集成起来。
[解决办法]
GetSelectionMark()
[解决办法]
int index=m_cList.GetSelectionMark( );
CString cardid=m_cList.GetItemText(index,0);
[解决办法]
lz你的nRow值本就应该是-1。
msdn上有:
iItem 
Identifier of the list-view item, or -1 if not used. 
也就是说nRow不是你想的表示某个listitem,而是"list-view的identifier"

[解决办法]
POSITION ps; 
int nIndex; 
ps = m_List.GetFirstSelectedItemPosition(); 
if(!pos)
return;
nIndex = m_List.GetNextSelectedItem(ps); 
先要判断有没有选中项目,再获取被选中的项目索引号。

热点排行