Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Выделение в списке


Автор: Homer 17.11.2006, 21:13
   Как в списке выделить элемент програмно (по приходе сообщение например)? вроде бы должно работать с SetSelectionMark, но ничего не выходит smile  

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

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

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

ПЭ.ЭС.
Сформулируй вопрос по понятнее!!!!!!!!!!!

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

Автор: Samotnik 19.11.2006, 00:25
Дело в том , что я с ListCtrl мало работаю ,в основном ListBox


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

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

      ListCtrl.SetSelectionMark(i);

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





Автор: Earnest 20.11.2006, 10:47
Вот так:
Код

myListCtrl.SetItemState (nItem, LVIS_SELECTED, LVIS_SELECTED);

Автор: sm4sh 22.2.2007, 09:39
Цитата(Earnest @ 20.11.2006,  10:47)
Вот так:
Код

myListCtrl.SetItemState (nItem, LVIS_SELECTED, LVIS_SELECTED);

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

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

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

Автор: chaos 22.2.2007, 10:29
что бы не выделялась куча итемов создай свой лист со стилем 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
   }
}

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

Автор: Earnest 22.2.2007, 18:16
В чем вопрос-то?
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;
}

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)