Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение в списке 
V
    Опции темы
Homer
Дата 17.11.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



   Как в списке выделить элемент програмно (по приходе сообщение например)? вроде бы должно работать с SetSelectionMark, но ничего не выходит smile  
PM MAIL   Вверх
Samotnik
Дата 18.11.2006, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 1
Всего: 191



Попробуй такой вариант:
m_list.SetSel( -1,FALSE );//сброс всего выделенного
i=-1;//т.к. начинается выделение не с 0 а с  -1

m_listBox.SetSel(i,true);//непосредственно выделение

m_listBox.GetCurSel()//для того чтобы получить выделенную строку

ПЭ.ЭС.
Сформулируй вопрос по понятнее!!!!!!!!!!!
PM MAIL   Вверх
Homer
Дата 18.11.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



   Это по-моему для CListBox, а мне надо для CListCtrl. Вопрос же в том, что мне нужно осуществить поиск в списке из другого диалогого окна, т.е. при нажатии ОК в диалоговом окне выделялась соответствующая (найденная) запись в списке.

PM MAIL   Вверх
Samotnik
Дата 19.11.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 1
Всего: 191



Дело в том , что я с ListCtrl мало работаю ,в основном ListBox


Может быть так:

if (ListCtrl.GetSelectionMark() == -1)

      ListCtrl.SetSelectionMark(i);

Это должно сработать ,только если нет выделенного текста в данный момент.





PM MAIL   Вверх
Earnest
Дата 20.11.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот так:
Код

myListCtrl.SetItemState (nItem, LVIS_SELECTED, LVIS_SELECTED);


Это сообщение отредактировал(а) Earnest - 20.11.2006, 10:48


--------------------
...
PM   Вверх
sm4sh
Дата 22.2.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Earnest @ 20.11.2006,  10:47)
Вот так:
Код

myListCtrl.SetItemState (nItem, LVIS_SELECTED, LVIS_SELECTED);

 Спасибо, это работает. Самого давно этот вопрос интересовал. Спрашивается, зачем тогда SetSelectionMark вообще?

Но к тебе у меня другой вопрос. Ситуация такая же - осуществляется поиск с диалогового окошка. Но если у меня в поле видимости уже есть выделенный элемент, то появится второй, который помечу уже я. Как этого избежать? К тому же в моей программе можно выделять несколько элементов. Вытекает 2 вопроса:
1. Как узнать индекс начального и конечного текущего видимого элемента? В мсдне видел функцию GetCountPerPage. А дальше как? Искать с нуля первый элемент, который видно и обновлять с него до последнего видимого? Как-то коряво... Еще появилась идея снимать выделение со ВСЕХ ранее помеченных с помощью функций GetFirstSelectedItemPosition и GetNextSelectedItem. Но тоже не идеально... Есть предложения на этот счет?
2. Какие параметры в SetItemState нужно задать, чтобы снять выделение?

Заранее благодарен.

Это сообщение отредактировал(а) sm4sh - 22.2.2007, 09:41
PM MAIL   Вверх
chaos
Дата 22.2.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



что бы не выделялась куча итемов создай свой лист со стилем LVS_SINGLESEL.
что бы снять выделения достаточно вроде SetItemState (nItem, 0, LVIS_SELECTED)

на счет перебрать все выделеные вот есть даже пример в мсдн:
Код

CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL);

POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
   TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = pList->GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!\n", nItem);
      // you could do your own processing on nItem here
   }
}

PM WWW   Вверх
sm4sh
Дата 22.2.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



chaos, я уже так и сделал. Думал, красИвее есть метод smile. LVS_SINGLESEL не ставлю специально, так как реализовано удаление всех выделенных. Так красивши ;) По поводу удаления нашел здесь же - http://forum.vingrad.ru/topic-108541.html .

Это сообщение отредактировал(а) sm4sh - 22.2.2007, 13:06
PM MAIL   Вверх
Earnest
Дата 22.2.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В чем вопрос-то?
chaos все правильно написал - нет другого способа. Если поставишь LVS_SINGLESEL, то при выборе итема выделение с другого будет автоматически сниматься, а нет - так все под твою ответственность.
Я обычно бы еще, для удобства, сделала функцию GetSelection, возвращающую номера всех выделенных элементов, чтобы локализовать код в одном месте:
Код

typedef std::vector<int> CItems;
CItems CMyListCtrl::GetSelection() const 
{
   int nCnt = GetSelectedCount();
   if(!nCnt) return CItems();

   CItems items(nCnt);
   int nItem = -1; 
   
   for (CItems::iterator it = items.begin(); it != items.end(); ++it) 
   {
       nItem = GetNextItem(nItem, LVNI_SELECTED);
       ASSERT(nItem != -1);
      *it = nItem;
   }
   return items;
}

Выделенные итемы можно удалять, менять им всем состояние, собирать свойства... да мало ли что еще.


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


 




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


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

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