我有一個用 C Builder XE6 撰寫的 VCL 表單應用程式,其中包含一個TListView平鋪視圖。
由于TListViewVCL 組件沒有 Tile 視圖選項,因此我在表單設計器中使用TListViewwithViewStyle=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=falseSortType=stNone
TListView具有以下事件OnInsert處理程式:
void __fastcall TForm1::ListView1Insert (TObject *Sender, TListItem *Item)
{
TLVTileInfo ti = {};
Item->Caption = " "; // ComCtl32.dll throws an access violation exception when caption is empty.
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;
}
}
我將一個專案插入到 中TListView,例如在頂部:
TListItem* Item = ListView1->Items->Insert(0);
該專案被插入到串列的頂部(Item->Index插入后為 0),但出現在螢屏上串列視圖的底部。
當我洗掉一個專案時,串列視圖會顯示該磁貼曾經所在的空白區域。洗掉后我用以下代碼修復了這個問題:
ListView_Arrange(ListView1->Handle, LVA_DEFAULT);
這會從串列視圖中洗掉空白空間。
不幸的是,這在插入專案后呼叫時無效。新插入的專案仍顯示在串列視圖的底部。
如果我在報表視圖的串列視圖中插入一個專案,一切都會按預期作業。只是不是在平鋪視圖中。
如何讓串列視圖Index在平鋪視圖中以正確的順序(即專案屬性的升序)顯示專案?
更新
事實證明,將視圖切換到任何其他型別并回傳會LV_VIEW_TILE導致串列視圖以正確的順序排列專案。
這可以在插入新專案后完成:
void __fastcall TForm1::Button1Click (TObject *Sender)
{
ListView1->Items->BeginUpdate(); // Disable repainting list view.
try
{
TListItem* Item = ListView1->Items->Insert(0);
Item->Caption = "New item";
ListView_SetView(ListView1->Handle, LV_VIEW_LIST); // Can be any LV_VIEW_... value other than LV_VIEW_TILE.
ListView_SetView(ListView1->Handle, LV_VIEW_TILE);
}
__finally
{
ListView1->Items->EndUpdate(); // Enable repainting list view.
}
}
uj5u.com熱心網友回復:
嘗試使用此代碼作為解決方法,做你想做的事,你甚至不會注意到從串列到平鋪視圖的切換。
void __fastcall TForm3::Button1Click(TObject *Sender)
{
ViewList(); // set ViewStyle to LV_VIEW_LIST
TListItem *item;
item = ListView1->Items->Insert(2); // insert it @ item index 2
// or ListView1->Items->Insert(ListView1->Selected->Index);
item->Caption = "Hello 1";
ViewTile(); // restore view to LV_VIEW_TILE
}
//---------------------------------------------------------------------------
void __fastcall TForm3::ViewTile()
{
//set view to Tile View
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);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::ViewList()
{
// restore view to List View aka vsReport
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_LIST);
}
添加您的 ListView_Arrange(ListView1->Handle, LVA_DEFAULT); 到您的彈出選單的 Delete1Click 事件(您已經這樣做了,但在這里顯示給其他人)。
void __fastcall TForm3::Delete1Click(TObject *Sender)
{
ListView1->DeleteSelected();
ListView_Arrange(ListView1->Handle, LVA_DEFAULT);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/506367.html
