2016-07-31 136 views
1

我有一個clistctrl顯示多個系統的多個數據。只有1個項目可以選擇不同的系統。以編程方式clistctrl選擇

最初,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

我給這個SA評論,因爲我無法驗證這一點,我想你需要做一個'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

感謝@IInspectable的評論。我已經刪除了LVIS_FOCUSED – cha

相關問題