C++Builder XE6中TListView Tile视图插入项显示位置异常问题
问题:VCL TListView Tile视图插入项显示位置异常
我使用C++Builder XE6开发VCL窗体应用,其中包含一个以Tile视图展示的TListView。由于VCL原生TListView组件未提供Tile视图选项,我先在窗体设计器中将ViewStyle设为vsReport,再通过代码切换为Tile视图:
void __fastcall TForm1::FormShow (TObject *Sender) { TLVTileViewInfo tvi = {}; tvi.cbSize = sizeof(tvi); tvi.dwMask = LVTVIM_COLUMNS; tvi.cLines = ListView1->Columns->Count - 1; ListView_SetTileViewInfo(ListView1->Handle, &tvi); ListView_SetView(ListView1->Handle, LV_VIEW_TILE); }
该TListView的属性设置如下:Checkboxes=true、GroupView=false、RowSelect=true、ShowWorkAreas=false、SortType=stNone,同时配置了OnInsert事件处理程序:
void __fastcall TForm1::ListView1Insert (TObject *Sender, TListItem *Item) { TLVTileInfo ti = {}; Item->Caption = " "; // 标题为空时ComCtl32.dll会抛出访问违例异常 ti.cbSize = sizeof(ti); ti.iItem = Item->Index; ti.cColumns = ListView1->Columns->Count - 1; ti.puColumns = new unsigned[ti.cColumns]; ti.piColFmt = new int[ti.cColumns]; try { for (unsigned i = 0; i < ti.cColumns; i++) { ti.puColumns[i] = 1 + i; ti.piColFmt [i] = LVCFMT_LEFT; } ListView_SetTileInfo(ListView1->Handle, &ti); } __finally { delete[] ti.puColumns; delete[] ti.piColFmt; } }
当我在列表顶部插入项(例如执行TListItem* Item = ListView1->Items->Insert(0);)时,项的Index为0,但实际显示在列表底部。删除项时列表会出现空白区域,我通过调用ListView_Arrange(ListView1->Handle, LVA_DEFAULT);解决了这个问题,但插入项后调用该方法无效。Report视图下插入项显示正常,仅Tile视图存在此异常。如何让Tile视图按照项的Index升序正确显示?
更新
我发现切换到其他视图再切回LV_VIEW_TILE可让列表正确排序,示例代码如下:
void __fastcall TForm1::Button1Click (TObject *Sender) { ListView1->Items->BeginUpdate(); // 禁用列表视图重绘 try { TListItem* Item = ListView1->Items->Insert(0); Item->Caption = "New item"; ListView_SetView(ListView1->Handle, LV_VIEW_LIST); // 可设置为除LV_VIEW_TILE外的任意LV_VIEW_...值 ListView_SetView(ListView1->Handle, LV_VIEW_TILE); } __finally { ListView1->Items->EndUpdate(); // 启用列表视图重绘 } }
内容的提问来源于stack exchange,提问作者Martin Nijhoff
相关产品推荐
相关产品推荐

