2015-04-30 34 views
6

Tôi không hiểu mục đích của LVCOLUMN.iSubItem là gì. Đây là những gì MSDN nói:Mục đích của LVCOLUMN.iSubItem là gì?

iSubItem

Type: int 

Index of subitem associated with the column. 

đầu tiên tôi nghĩ rằng nó có nghĩa là khi tôi tạo một cột, tôi có thể thiết lập một chỉ số để cột, ví dụ: 123, và sau đó khi tôi muốn chèn một số dữ liệu vào cột, tôi chỉ cung cấp số 123 làm mã nhận dạng cho cột.

Nhưng nó không hoạt động, không có vấn đề gì chỉ tôi đặt vào các cột, các cột được đánh số vẫn 0, 1, 2, 3, ...

+0

Tôi có hai dự đoán. Hoặc là 1) bạn không chỉ định 'LVCF_SUBITEM' trong' LVCOLUMN.mask', hoặc 2) 'iSubItem' chỉ được sử dụng bởi' LVM_GETCOLUMN' (ví dụ, để lấy subitem của một cột dựa trên thứ tự của nó sau khi sắp xếp lại). Không có gì trong tài liệu hướng tới giải thích thứ hai, mặc dù ... – andlabs

Trả lời

4

Không, LVCOLUMN.iSubItem được đánh số liên tiếp từ 0, từ trái sang phải khi bạn phát hiện ra. Có, nó chắc chắn có vẻ như nó không có mục đích vì bạn phải luôn luôn xác định số cột để làm bất cứ điều gì với một LVCOLUMN. Vì vậy, nó chỉ cung cấp cho bạn trở lại những gì bạn đã biết.

Khó đoán xem điều này đã xảy ra như thế nào, ngoài việc lưu ý rằng các điều khiển chung không chính xác là thời điểm tốt nhất của Microsoft. Tôi nghi ngờ nó có thể có liên quan đến LVS_EX_HEADERDRAGDROP trên chế độ xem danh sách. Điều đó cho phép người dùng sắp xếp lại các cột bằng cách kéo chúng. Bây giờ chỉ mục cột bạn vượt qua đến LVM_GETCOLUMN hơi u ám, có phải chỉ ra vị trí hoặc gốc chỉ mục của cột không? Họ đã đi với thứ hai và sử dụng LVM_GETCOLUMNORDERARRAY nếu bạn cần biết cách người dùng sắp xếp các cột.

Hoặc đơn giản là chúng được nhân đôi LVITEM.iSubItem để giữ cấu trúc tương tự, có lẽ hơi giống một chút. Đừng lo lắng về điều đó.

+0

Thành viên iSubItem là ListCtrl iSubItem.Khi ở chế độ báo cáo, người dùng có thể kéo các cột theo thứ tự khác, ẩn cột hoặc chèn cột mới, nếu ứng dụng của bạn cho phép. ISubItem sẽ luôn giữ nguyên cho một cột nhất định, liên kết nó với thông tin bạn cung cấp và giữ nguyên trong suốt thời gian kiểm soát. –

1

Các subitem chỉ có giá trị và chức năng cho điều khiển danh sách với phong cách LVS_REPORT. Bạn cần phải chèn cột để sử dụng nó.

Với kiểu này, bạn thêm các mục LVM_INSERTITEM và mỗi mục có thể có các mục con. Để giải quyết các nội dung của một subitem bạn cần các thành viên của cấu trúc.

+0

"Để giải quyết các nội dung của một subitem bạn cần thành viên của cấu trúc" Đây là lý do tại sao tôi hỏi câu hỏi này, thành viên của cấu trúc ('LVCOLUMN.iSubItem') không liên quan và các cột được đánh số 0, 1, 2, 3, ... – user4582812

1

Nếu bạn sử dụng kiểu LVS_REPORT, điều khiển chế độ xem danh sách trông giống như điều khiển lưới.

Trong trường hợp này, các mục được lưu trữ trong cột 0 và mục con đại diện cho những gì được lưu trữ trong các cột khác (không có khái niệm toàn bộ như "ô"). Vì vậy, chỉ mục phụ được sử dụng đáng kể với các thông báo LVM_SETITEMLVM_GETITEM (hoặc với các macro tương ứng ListView_SetItemListView_GetItem), để viết hoặc đọc giá trị văn bản cột X chẳng hạn. Tùy thuộc vào chỉ số bạn truy cập vào mục, nếu iSubItem == 0, hoặc một subitem, nếu iSubItem> = 1.

Bạn có thể có một cái nhìn tại câu hỏi này ở đây trên SO cho mẫu phụ: Items and Subitems in List-View control