我的代码如下,目的是修改指定的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列的内容?谢谢了。

解决方案 »

  1.   

    怎麽可能.
    你直接用最後的代碼寫在一個新工程中再試.
    int s=m_listRoles.InsertItem(m_listRoles.GetItemCount(), "初值");
    m_listRoles.SetItemText(s, 0, "成功");
    m_listRoles.SetItemText(s, 1, "...");
    m_listRoles.SetItemText(s, 2, "...");
      

  2.   

    m_listRoles.SetItemText(nIndex, 1, "...");很认真的告诉你 你的参数写错位了
    CListCtrl::SetItemTextBOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText)返回值:如果成功,则返回非零值,否则为0。参数: nItem 要设定文本项的索引值。  
    nSubItem 子项的索引,若为零,则设置项标签。  
    lpszText 指向包含新项文本字符串的指针。  说明:改变列表视图项或子项的文本。
      

  3.   

    去掉CListCtrl的自动排序(sort)选项或者从后面的列向前面修改,也就是最后修改 0 列(默认排序列)
      

  4.   

    CListCtrl::SetItemText BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText) 返回值:如果成功,则返回非零值,否则为0。 参数: nItem 要设定文本项的索引值。  
    nSubItem 子项的索引,若为零,则设置项标签。  
    lpszText 指向包含新项文本字符串的指针。  说明:改变列表视图项或子项的文本。
      

  5.   

    结果还是不行啊。
    我用你给的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.困扰了好几天了,请帮帮忙吧。
      

  6.   

    我也是菜鸟,握握手吧。
    请问你还记得是怎么解决的吗?或者最可能是什么原因?CListCtrl使用哪里出了问题啊?
    为什么偏偏是第0列无法修改,当然插入时也无法SetItemText来设置第0列。其他列都能够成功设置。
    我在别人的机器上也出现这个情况。应该不是VC的问题。
      

  7.   

    在新建的工程中使用测试代码却能够产生需要的效果。
    建立一个单文档程序,使用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, "..."); 效果和期待的一样,为:"成功" "..." "...",而"初值"就更本不显示了。
    可是在我原先的工程中则始终不正确,请指点一二,谢谢
      

  8.   

    这个CListCtrl是放在自定义的FormView中的,并且将该FormView从所处的Dll中导出了,在主程序中使用了该FormView,请问会有影响吗? 
    对于第0列来说SetItemText返回值总是为0,但是@err,hr却显示S_OK.困扰了好几天了,请帮帮忙吧。
    我先问下是不是跨线程的 如果跨线程是不能直接调用指针 会有莫名其妙的问题一堆。要传也是传句柄或者利用sendmessage方式来响应。
      

  9.   

    还有你这个m_listRoles是怎么创建的 代码贴一下 明天早上来看看
      

  10.   

    还有你这个m_listRoles是怎么创建的 代码贴一下 明天早上来看看
      

  11.   

    对比我以前用的还有MSDN里写的。CListCtrl::InsertColumn
    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);
    }吧?
      

  12.   

    谢谢大家,终于解决了。菜鸟一个,让大家见笑了,果然还是代码写的问题。
    这里归纳一下,也请大家留意这个陷阱啊。当然还有一些没有搞懂,请帮忙再看看。我为了当对CListCtrl中的项进行修改时焦点保持不变,从而确定对当前行的修改。而响应了LVN_ITEMCHANGING消息,在其中使得返回TRUE,也就是说不进行改变当前行。可是在保存、提交数据时SetItemText()也导致了LVN_ITEMCHANGING消息的发生,由于判断不完全,导致了依然返回TRUE。这样的话就失败了,而且产生了几乎是不可能发生的问题。
    估计就是这里出了问题,因为我把LVN_ITEMCHANGING的响应去掉之后就一切OK了。不过后面从第1列开始却又成功了,具体原因我就搞不清楚了,因为SetItemText是一个接着一个的,为什么后面的却可以呢?还请大家指导,非常感谢。