2016-07-31 4 views
1

У меня есть clistctrl, который показывает несколько данных для нескольких систем. Только один элемент может быть выбран из другой системы.clistctrl selection programatically

Первоначально clistctrl загружает первый элемент, выбранный из элемента управления для разных систем.

Но когда я меняю выбор, щелкнув элемент в сетке после изменения данных в модели и установки выделения, он не отображает выбор как из моей структуры данных. вместо этого он отображает только выбранную строку. Примечание. Моя структура данных имеет правильное значение, и выбор настройки выполняется правильно. Перед отбором я делаю отменить выбор. метод Выбрать Отменить:

void SelectRow(int index) 
    { 
    SetFocus(); 
    EnsureVisible(index, FALSE); 
    SetItemState(index, LVIS_SELECTED, LVIS_SELECTED); 
    } 
    void DeselectRow(int index) 
    { 
    SetItemState(index, ~LVIS_SELECTED, LVIS_SELECTED); 
    } 

Afx сообщение для по щелчку:

void MDialog::OnSelectedItemChanged(NMHDR* pNMHDR, LRESULT*pResult) 
{ 
UpdateData(FALSE); 
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
switch (pNMListView->hdr.code) 
{ 
case LVN_ITEMCHANGED: 
{ 
    (pNMListView->uNewState & LVIS_SELECTED) 
    if (!m_lockSelection && (pNMListView->uChanged & LVIF_STATE)) 
    { 
     m_lockSelection = true; 
     FINALLY([=] { 
      m_lockSelection = false; 
     }); 
     m_allPositionsView.ViewModel().Update(ntype::selection, pNMListView->iItem); 
    } 
} 
break; 
} 
UpdateData(TRUE); 
} 

Наконец уведомление о событии, где я выбор:

void MDialog::OnRefinedProgramViewModelNotify(const MyProject::abc::ntype& notifyId) 
{ 
    for (int i = 0; i < int(m_allPositionsView.ViewModel().Model().Count()); ++i) 
    { 
     if (m_allPositionsView.ViewModel().Model().At(i).IsSelectedPosition()) 
        { 
         m_allPositionsView.SelectRow(i); 
        } 
    } 
} 

Программа выполняет метод выбора правильно.

 m_allPositionsView.SelectRow(i); 

Но на вид я вижу только выбранный элемент. Но есть и другие предметы, которые я ожидаю остаться выбранными.

Почему он не может сделать выбор, который я делаю программно?

+0

даю это са комментарий, так как я не могу проверить это, я думаю, что вам нужно сделать «SetItemState (index, 0, LVIS_SELECTED)», чтобы отменить выбор строки –

ответ

0

Чтобы отменить выбор варианта использования index подряд этот код:

 UINT nState = GetItemState(index, LVIS_SELECTED); 
     nState &= ~LVIS_SELECTED; 
     SetItemState(index, nState, LVIS_SELECTED); 

Чтобы выбрать использование index строки:

 SetItemState(index, LVIS_SELECTED, LVIS_SELECTED); 
+0

* «вам не нужно использовать« LVIS_FOCUSED », но я рекомендую использовать его, так как он выглядит лучше» * - Ник или нет, это неправильно. Теперь у вас есть два элемента в диалоговом окне, которые кажутся сфокусированными. 'LVIS_FOCUSED' действительно полезно только для определения состояния элемента при выполнении пользовательского чертежа. – IInspectable

+1

Спасибо @Inpectable за комментарий. Я удалил LVIS_FOCUSED – cha