我把一个文件的数据读进去了,可以左键选中任意一行.
接着我要读另一个文件的数据,调用了一次DeleteAllItem
然后文件读进去后...任何一行都无法选中......响应左键点击消息,返回的 item,subitem 都是 -1 何解
有解决办法吗? 

解决方案 »

  1.   

    看不懂。。插入Item的代码贴点上来吧。
      

  2.   


    void Onload()
    {
    GetListCtrl().SetRedraw(FALSE);
    GetListCtrl().DeleteAllItems();
    GetListCtrl().SetRedraw(TRUE);  //删除所有表项
    int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
    for (int i = 0;i < n;i++)
    {
        GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
    } //删除所有列头
    ...后面就是循环InsertItem了...
    }
    第1次调用,表里面的行都可以选中.
    第2次调用,都不能选中了....
      

  3.   

    CHeaderCtrl*ptr=m_list->GetHeaderCtrl();
    int ncount=ptr->GetItemCount();
    if(ncount)
    {
    for(int j=0;j<ncount;j++)
    {
    m_list->DeleteColumn(0);
    }
    }和楼主的差别不大,我的程序能够运行
      

  4.   

    你在删除前 应设置 ShowWindow(SW_HIDE)或则GetListCtrl().SetRedraw(FALSE);
    否则如果 你有100行,100列.那么你的视图会重绘1W次....闪烁严重..主要是我一直没找到原因啊....选不中.... 而item有确实存在,我可以调用SetItemState选中...
      

  5.   

    不是啊,楼主你要搞清楚,上面那一段只是设置你的列头的名字和长度,而后才会对行加载数据,
    你的程序把这两个混在一起了,我是把格式和数据添加分别写为了两个函数,我现在可以用CListCtrl显示不同的数据表完全没有问题,楼主你对列头和行没有分清楚吧
      

  6.   

    好像我调用DeleteAllItem后 整个 ClistCtrl 属性都发生了变化....
    第1次调用...
    后左键能选中,要选多行,需按Shift键+鼠标左键.
    第2次调用后,左键无法选中,选中多行 可以直接拖动鼠标...同时会出现类似在桌边 拖动鼠标一样出现一个矩形....
      

  7.   


    void CListTextView::OnLoadloc()
    { // TODO: 在此添加命令处理程序代码
    GetListCtrl().SetRedraw(FALSE);
    GetListCtrl().DeleteAllItems();
    GetListCtrl().SetRedraw(TRUE);
    int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
    for (int i = 0;i < n;i++)
    {
    GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
    } //清空 
    GetListCtrl().InsertColumn(0,_T("文件序号"),0,80);
    GetListCtrl().InsertColumn(1,_T("文件内容长度(字符数UNICODE)"),0,80);
    GetListCtrl().InsertColumn(2,_T("相对内容表的偏移"),0,80);
    GetListCtrl().InsertColumn(3,_T("文件名"),LVCFMT_CENTER,800); CString szFilters = _T("Pak Files (*.loc)|*.loc|All Files (*.*)|*.*||");
    CFileDialog fileDlg(TRUE, _T("loc"), _T("pack"),OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);
    if(fileDlg.DoModal() == IDOK)
    {
    CString pathName = fileDlg.GetPathName();
    if (pathName.Find(_T("pack.loc")) == -1)
    {
    MessageBox(_T("请找到pack.loc文件"),_T("提示"));
    return;
    }
    HANDLE hFile,hFileMap;
    BYTE* pFile;
    hFile = CreateFile(pathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
    pFile = (BYTE*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
    if (!pFile)
    {
    MessageBox(_T("CreateFileMapping Fail!"),_T("Error2"),MB_OK);
    CloseHandle(hFileMap);
    CloseHandle(hFile);
    return;
    }

    BYTE* pBeign  = pFile;
    DWORD dwoffsetTab2 = *(DWORD*)(pFile + 0x4);
    BYTE* pSecTab = pFile + 0x8 + dwoffsetTab2;
    pSecTab += 0x8;   //第2张表
    DWORD dwIndexCount = *(DWORD*)(pFile + 0xC);  //索引总个数
    pFile += 0x10;  //来到第1个索引
    GetListCtrl().ShowWindow(SW_HIDE);
    for (int i = 0;i < dwIndexCount;i++)
    {
    DWORD dwOffset = *(DWORD*)pFile;
    DWORD dwFileNameLen = *(DWORD*)(pFile + 0x4);
    DWORD dwnIndex = *(DWORD*)(pFile + 0x8);
    CString szIndex;
    szIndex.Format(_T("0x%X"),dwnIndex);
    TCHAR bufFileName[0x200] = {0};
    char bufFileNameA[0x200] = {0};
    memcpy_s(bufFileNameA,0x200,(void*)(pFile + dwOffset),dwFileNameLen);
    MultiByteToWideChar(CP_UTF8,0,bufFileNameA,dwFileNameLen,bufFileName,dwFileNameLen);
    DWORD dwTab2_0 = *(DWORD*)pSecTab;
    DWORD dwTab2_1 = *(DWORD*)(pSecTab + 0x4);
    CString szTab0,szTab1;
    szTab0.Format(_T("0x%X"),dwTab2_0);
    szTab1.Format(_T("0x%X"),dwTab2_1);
    int j = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(),_T(""));
    GetListCtrl().SetItemText(j,0,szIndex);
    GetListCtrl().SetItemText(j,1,szTab0);
    GetListCtrl().SetItemText(j,2,szTab1);
    GetListCtrl().SetItemText(j,3,bufFileName);
    pFile += 0xC;
    pSecTab += 0x8;
    }
    UnmapViewOfFile(pBeign);
    CloseHandle(hFileMap);
    CloseHandle(hFile);
    GetListCtrl().SetHotItem(0);
    GetListCtrl().ShowWindow(SW_SHOW);
    // Implement opening and reading file in here. //Change the window's title to the opened file's title.
    }
    }
      

  8.   

       int j = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(),_T(""));
                GetListCtrl().SetItemText(j,0,szIndex);
                GetListCtrl().SetItemText(j,1,szTab0);
                GetListCtrl().SetItemText(j,2,szTab1);
                GetListCtrl().SetItemText(j,3,bufFileName);
                pFile += 0xC;
                pSecTab += 0x8;
    这一段好像有问题,我的程序段是
      Row=m_list->GetItemCount();
      CString rowid;
      rowid.Format(L"%d",Row);
      m_list->InsertItem(Row,rowid);
                             CString addstr=q1.fieldValue(i);
              m_list->SetItemText(Row,i,addstr);
      

  9.   

     for (int i = 0;i < dwIndexCount;i++)
    这里的dwIndexCount不是你列的个数,有可能越界,楼主要加分啊
      

  10.   

    for (int i = 0;i < dwIndexCount;i++)
    dwIndexCount   这是行的个数.... 
    GetListCtrl().SetItemText(j,0,szIndex);
    GetListCtrl().SetItemText(j,1,szTab0);
    GetListCtrl().SetItemText(j,2,szTab1);
    GetListCtrl().SetItemText(j,3,bufFileName);  //这是列的个数 只4列
      

  11.   

    内存映射文件,如出问题,而我又没加异常处理,有问题当崩溃....
    而且,文件的结构我分析好了的,算准的...不会出错的......就算有错 该不会影响Clistctrl才是
      

  12.   

    // int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
    // for (int i = 0;i < n;i++)
    // {
    // GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
    // } //清空 
    去掉这几句后 程序正常.....果然 删除完所有列头后,会改变属性......
      

  13.   

    一直很纠结,Clistctrl 的限制太多了....
    只有第1列可双击编辑
    第1列的文本只能左对齐
    删除第1列列头 还会出现这种效果....
      

  14.   

    没办法,要不你用C#啊,MFC的控件是这样,要不就重写
      

  15.   


    你可以在鼠标双击的列上 摆个EDIT控件,EDIT控件的高度和宽度 = 该列的高度和宽度,
    这样每列都可以编辑了,编辑完了 再隐藏或 delete 掉这个EDIT控件。