在 clistctrl 中选择行

编程


C++
void CDlgCorrection::RowSelected()
{
	m_bInizio = false;
	for (int i = 0; i < m_astrPath.GetSize(); i++)
	{
		m_lista.SetItemState(i, 0, LVIS_SELECTED);
	}

	m_lista.SetItemState(m_nRow, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
	m_nRowSelected = m_nRow;
	m_lista.SetFocus();
	m_lista.SetSelectionMark(m_nRow);
}

我使用此代码在 CListCtrl 中选择一行,但如果我在 CListCtrl 中单击,则该行被选中,因此我选择了 2 行..如何在单击列表之前取消选择一行

我尝试过的:

我试着写:

C++
m_lista.SetItemState(m_nRow, ~LVIS_SELECTED | ~LVIS_FOCUSED, ~LVIS_SELECTED | ~LVIS_FOCUSED);

我也尝试过

C++
if(m_nRow!= -1)
	m_lista.SetItemState(m_nRow, ~LVIS_SELECTED, LVIS_SELECTED);

	POSITION			pos = NULL;
	INT_PTR				nPos;

	pos = m_lista.GetFirstSelectedItemPosition();
	if (pos)
	{
		nPos = m_lista.GetNextSelectedItem(pos);
	}
	else
	{
		nPos = -1;
	}

但我还是选择了 2 行

….我解决了:

C++
void CDlgCorrection::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{		
		m_lista.SetItemState(m_nrow, 0, LVIS_SELECTED);
		
		m_nRowSelected = -1;
		m_lista.SetFocus();
		m_lista.SetSelectionMark(-1);
}

解决方案2

如果选择两行是一个问题,则将控件的属性设置为仅允许单个选择。 这可以使用资源编辑器或代码来完成。

您可能需要考虑使用此站点上提供的许多派生列表控件类之一。 我用这个: CReportCtrl – 报告样式 CListCtrl 的极其方便的版本[^]。

解决方案1

尝试:

C++
m_lista.SetItemState(m_nRow, 0, LVIS_SELECTED | LVIS_FOCUSED);

这应该将两个状态位设置为零。

解决方案3

尝试这个。 在您的 OnCreate 函数中

C++
GetListCtrl().SetExtendedStyle(LVS_EX_FULLROWSELECT);

コメント

タイトルとURLをコピーしました