Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрыть столбцы в CListCtrl 
:(
    Опции темы
AlexPro
Дата 15.6.2006, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Нужно скрыть (не удалить!) некоторые столбцы в CListCtrl. Не могу сообразить, как лучше сделать. Вроде, готового механизма фильтрации столбцов нет. Задание нулевой ширины работает до первого изменения ширины столбца пользователем. Поиск удовлетворительного результата тоже не дал. Кто сталкивался - подскажите, как решали проблему. 
PM MAIL   Вверх
Earnest
Дата 15.6.2006, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Такого решения - и иметь колонку, и не показывать ее - для List View нет. Это тебе не таблица.
Можно поставить нулевую ширину, а потом следить за сообщениями хедера, и не давать изменить эту колонку. Но это, конечно, не удовлетворительное решение: все не перехватишь, т.е. пользователь все равно сможет зацепить и потянуть, а ты максимум, что можешь - потом вернуть в 0. Посмотри HDN_ сообщения: их нужно ловить на уровне List View.
Но более предпочтительный вариант - все же удалять скрытые колонки. Конечно, при этом придется заморочится с их нумерацией, но можно ведь сделать двойную индексацию: iSubItem, который передается в колонку при создании вовсе не обязан совпадать с ее реальным номером. Примерно так:
Код

// это идентификаторы нужных тебе саб-итемов, фиксированные
enum {L_ONE,L_TWO,L_THREE, ... L_CNT };

void CMyListCtrl::UpdateContent (bool bDataOnly)
{
   SetRedraw(FALSE);
   DeleteAllItems();

   if (!bDataOnly)
   {
      // заново создаем столбцы
      while (DeleteColumn(0));

      for (int i=0,c=0; i < L_CNT; i++) 
         if (IsSubItemVisible(i)) // это твоя ф-я, которая откуда-нибудь узнает сабж
         {
              LV_COLUMN lvc;
              // ...
              lvc.iSubItem = i;
              InsertColumn (c++,&lvc); 
         }
    }
   // заполняем данными
   for (int row = 0; row < ...; ++row)
   {
      // вставляем новую строку ... 
      for int i=0; i < L_CNT; ++i)
         if (IsSubItemVisible(i)) 
         {
            ...
         }   
   }
   SetRedraw(TRUE);
}


Вызываешь эту функцию при инициализации, а также при включении\выключении колонок. Это пример из реального кода, так что точно работает. Естественно, в дальнейшем нужно всегда опираться на номер саб-итема, а не колонки.  


--------------------
...
PM   Вверх
DeadSoul
Дата 15.6.2006, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



AlexPro, вариант - удалить все колонки, добавить нужные по каким причинам не устраивает?

P.S. Стандартного способа нет, как ты верно заметил 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
AlexPro
Дата 15.6.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(DeadSoul @  16.6.2006,  05:55 Найти цитируемый пост)
AlexPro, вариант - удалить все колонки, добавить нужные по каким причинам не устраивает?


DeadSoul, рассматривал я такой вариант в самую первую очередь и пришел к выводу, что он мне не подходит. Если бы нужно было просто отобразить список, это было бы хорошим решением. Но у меня идет активная работа со списком и каждый раз нужно будет вычислять, скажем, кликнул юзер в колонке №1, или там, перед этой колонкой, были еще удаленные колонки, и сколько именно колонок было удалено - в общем, об этой проблеме упомянула Earnest.

Earnest, спасибо за пример. За неимением более изящного решения воспользуюсь этим. smile  Про iSubItem я как-то упустил.

ЗЫ: Не питаю особой нелюбви к главе Майкрософта, однако, когда сталкиваюсь с подобными вещами, ловлю себя на желании скинуться на очередной тортик для Билла Гейтса. smile  smile   

Это сообщение отредактировал(а) AlexPro - 15.6.2006, 23:27
PM MAIL   Вверх
DeadSoul
Дата 15.6.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11





--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
AlexPro
Дата 15.6.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



DeadSoul, спасибо за ссылочку, это почти то, что нужно.  smile Почти, потому что на самом деле используется CListView и подключить к нему сторонний CListCtrl не получится. Но, думаю, и этот товар не пропадет. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.