我的代码如下,目的是修改指定的nIndex行的列表框CListCtrl内容:m_listRoles.SetItemText(nIndex, 0, "Zero");
m_listRoles.SetItemText(nIndex, 1, "One");
m_listRoles.SetItemText(nIndex, 2, "Two");该列表框一个有3列for (int i=0; i<3; i++)
{
m_listRoles.InsertColumn(i, header[i], fmt[i], width[i]);
}插入过程是通过LVITEM lvi;
ZeroMemory(&lvi, sizeof(LVITEM));
lvi.iItem = m_listRoles.GetItemCount();
lvi.lParam = f();
lvi.pszText = (LPTSTR)(LPCTSTR)m_str;
lvi.cchTextMax = m_str.GetLength();
lvi.mask = LVIF_PARAM | LVIF_TEXT;
int nIndex = m_listRoles.InsertItem(&lvi);m_listRoles.SetItemText(nIndex, 0, m_str);
m_listRoles.SetItemText(nIndex, 1, "...");
m_listRoles.SetItemText(nIndex, 2, "...");问题就出现在修改第nIndex行指定内容时,无法设置第0列的内容,其他两列都设置成功了,第0列保持为先前的值。以前一直没有遇到过这样的问题。而且插入Item时也不需要如此复杂,直接如下就可以了:m_listRoles.InsertItem(nIndex, "");
m_listRoles.SetItemText(nIndex, 0, m_str);
m_listRoles.SetItemText(nIndex, 1, "...");
m_listRoles.SetItemText(nIndex, 2, "...");可是这次却无法直接这样做,也是第0列显示不正常。
请问有谁知道处理第0列的问题吗?特别的是有没有办法能成功更新第0列的内容?谢谢了。
m_listRoles.SetItemText(nIndex, 1, "One");
m_listRoles.SetItemText(nIndex, 2, "Two");该列表框一个有3列for (int i=0; i<3; i++)
{
m_listRoles.InsertColumn(i, header[i], fmt[i], width[i]);
}插入过程是通过LVITEM lvi;
ZeroMemory(&lvi, sizeof(LVITEM));
lvi.iItem = m_listRoles.GetItemCount();
lvi.lParam = f();
lvi.pszText = (LPTSTR)(LPCTSTR)m_str;
lvi.cchTextMax = m_str.GetLength();
lvi.mask = LVIF_PARAM | LVIF_TEXT;
int nIndex = m_listRoles.InsertItem(&lvi);m_listRoles.SetItemText(nIndex, 0, m_str);
m_listRoles.SetItemText(nIndex, 1, "...");
m_listRoles.SetItemText(nIndex, 2, "...");问题就出现在修改第nIndex行指定内容时,无法设置第0列的内容,其他两列都设置成功了,第0列保持为先前的值。以前一直没有遇到过这样的问题。而且插入Item时也不需要如此复杂,直接如下就可以了:m_listRoles.InsertItem(nIndex, "");
m_listRoles.SetItemText(nIndex, 0, m_str);
m_listRoles.SetItemText(nIndex, 1, "...");
m_listRoles.SetItemText(nIndex, 2, "...");可是这次却无法直接这样做,也是第0列显示不正常。
请问有谁知道处理第0列的问题吗?特别的是有没有办法能成功更新第0列的内容?谢谢了。
你直接用最後的代碼寫在一個新工程中再試.
int s=m_listRoles.InsertItem(m_listRoles.GetItemCount(), "初值");
m_listRoles.SetItemText(s, 0, "成功");
m_listRoles.SetItemText(s, 1, "...");
m_listRoles.SetItemText(s, 2, "...");
CListCtrl::SetItemTextBOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText)返回值:如果成功,则返回非零值,否则为0。参数: nItem 要设定文本项的索引值。
nSubItem 子项的索引,若为零,则设置项标签。
lpszText 指向包含新项文本字符串的指针。 说明:改变列表视图项或子项的文本。
nSubItem 子项的索引,若为零,则设置项标签。
lpszText 指向包含新项文本字符串的指针。 说明:改变列表视图项或子项的文本。
我用你给的int s=m_listRoles.InsertItem(m_listRoles.GetItemCount(), "初值");
m_listRoles.SetItemText(s, 0, "成功");
m_listRoles.SetItemText(s, 1, "...");
m_listRoles.SetItemText(s, 2, "..."); 结果显示为:
"初值" "..." "..."
这三列,而没有"成功"列。另外对于修改操作,我测试了m_listRoles.SetItemText(0, 0, "成功");
m_listRoles.SetItemText(0, 1, "...");
m_listRoles.SetItemText(0, 2, "..."); 结果是第1、第2列发生了改变,第0列仍然保持原样,没有变成"成功".
这个CListCtrl是放在自定义的FormView中的,并且将该FormView从所处的Dll中导出了,在主程序中使用了该FormView,请问会有影响吗?
对于第0列来说SetItemText返回值总是为0,但是@err,hr却显示S_OK.困扰了好几天了,请帮帮忙吧。
请问你还记得是怎么解决的吗?或者最可能是什么原因?CListCtrl使用哪里出了问题啊?
为什么偏偏是第0列无法修改,当然插入时也无法SetItemText来设置第0列。其他列都能够成功设置。
我在别人的机器上也出现这个情况。应该不是VC的问题。
建立一个单文档程序,使用CFormView
代码m_list.InsertColumn(0, "Zero", LVCFMT_LEFT, 100);
m_list.InsertColumn(1, "First", LVCFMT_LEFT, 100);
m_list.InsertColumn(2, "Second", LVCFMT_LEFT, 100);int s=m_list.InsertItem(m_list.GetItemCount(), "初值");
m_list.SetItemText(s, 0, "成功");
m_list.SetItemText(s, 1, "...");
m_list.SetItemText(s, 2, "..."); 效果和期待的一样,为:"成功" "..." "...",而"初值"就更本不显示了。
可是在我原先的工程中则始终不正确,请指点一二,谢谢
对于第0列来说SetItemText返回值总是为0,但是@err,hr却显示S_OK.困扰了好几天了,请帮帮忙吧。
我先问下是不是跨线程的 如果跨线程是不能直接调用指针 会有莫名其妙的问题一堆。要传也是传句柄或者利用sendmessage方式来响应。
int InsertColumn( int nCol, const LVCOLUMN* pColumn );int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 );
插入列命令有5个参数,你好像只写了4个参数,第5个参数你没有写。
你写的是for (int i=0; i<3; i++)
{
m_listRoles.InsertColumn(i, header[i], fmt[i], width[i]);
}应该是for (int i=0; i<3; i++)
{
m_listRoles.InsertColumn(i, header[i], fmt[i], width[i],i);
}吧?
这里归纳一下,也请大家留意这个陷阱啊。当然还有一些没有搞懂,请帮忙再看看。我为了当对CListCtrl中的项进行修改时焦点保持不变,从而确定对当前行的修改。而响应了LVN_ITEMCHANGING消息,在其中使得返回TRUE,也就是说不进行改变当前行。可是在保存、提交数据时SetItemText()也导致了LVN_ITEMCHANGING消息的发生,由于判断不完全,导致了依然返回TRUE。这样的话就失败了,而且产生了几乎是不可能发生的问题。
估计就是这里出了问题,因为我把LVN_ITEMCHANGING的响应去掉之后就一切OK了。不过后面从第1列开始却又成功了,具体原因我就搞不清楚了,因为SetItemText是一个接着一个的,为什么后面的却可以呢?还请大家指导,非常感谢。