2017-06-13 25 views
2

我在這裏遇到了一些麻煩。看來我無法刪除所有列或(重置)列表視圖。這裏是相關的代碼:不可能刪除ListView中的最後一列嗎?

HWND resultListView = GetDlgItem(hwnd, IDC_RESULTCONTROL); 
SendMessage(resultListView, LVM_DELETEALLITEMS, 0, 0); //All items are deleted 

//Get numebr of columns 
HWND hWndHdr = (HWND)::SendMessage(resultListView, LVM_GETHEADER, 0, 0); 
int count = (int)::SendMessage(hWndHdr, HDM_GETITEMCOUNT, 0, 0L); 

for (int colIndex = 0; colIndex < count; colIndex++) { 
    ListView_DeleteColumn(resultListView, colIndex); 
} 

///... Irrelevant code 

HWND listbox = GetDlgItem(hwnd, IDC_SELECTEDLISTBOX); 
int numberOfItemsSelected = SendMessage(listbox, LB_GETLISTBOXINFO, 0, 0); 
vector<string> selectedItemsStringsVector; 
char buf[250]; 
LVCOLUMN buffer; 

//Add Selected Columns 
for (int i = 0; i < numberOfItemsSelected; i++) { //In this case always 2 "Date" and "Time" for testing. 
    SendMessage(listbox, LB_GETTEXT, i, (LPARAM)buf); 
    selectedItemsStringsVector.push_back(buf); 
    buffer.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; 
    buffer.fmt = LVCFMT_LEFT; 
    buffer.cx = 100; 
    buffer.pszText = buf; 
    buffer.cchTextMax = lstrlen(buf); 
    buffer.iSubItem = i; 
    buffer.iImage = 0; 
    buffer.iOrder = 0; 
    ListView_InsertColumn(resultListView, i, &buffer); //Works fine. Maybe I add an extra column here?? 
} 

在調試模式下,我所有的變量都有預期的值。

FirstButtonClick調試模式下的列數(變量count = 2)都很好。

image

SecondButtonClick列數= 3,但它不會刪除它們?

image

英語不是我的主要語言,我有點難倒現在...

+8

您需要按相反順序刪除它們,或者只是始終索引爲零。一旦刪除了三列中的索引#0,那麼索引#2已成爲#1,並且不再需要在for循環結束時將其刪除。 – doynax

+0

認爲你考慮到每一個'ListView_DeleteColumn'後Colum索引被改變 - 減1。所以你需要每次刪除#0列col – RbMm

+0

哦!生病立即嘗試! –

回答

3

列在header control該指數總是連續編號,從0開始。用戶代碼不控制列的索引。刪除一列時,朝向較高索引的列索引向下移動1.這就是爲什麼最終致電ListView_DeleteColumn失敗的原因。

有解決這個兩個選項:

  • 刪除列開始,最終指數下跌到0刪除最後一列不改變其他列的索引,所以他們在整個刪除操作穩定。
  • 總是刪除第一列(在索引0處)。

第二種方法既易於實現又易於閱讀。以下循環將刪除所有列:

for (int colIndex = 0; colIndex < count; ++colIndex) { 
    ListView_DeleteColumn(resultListView, 0); 
}