Seleccionar fila en clistctrl

programación


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);
}

Utilicé este código para seleccionar una fila en mi CListCtrl, pero si hago clic en mi CListCtrl, la fila se selecciona, por lo que tengo 2 filas seleccionadas. ¿Cómo puedo anular la selección de una fila antes de hacer clic en mi lista?

Lo que he probado:

Intenté escribir:

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

lo intenté también

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;
	}

pero de todos modos tengo 2 filas seleccionadas

….Lo resolví:

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);
}

Solución 2

Si tener dos filas seleccionadas es un problema, configure las propiedades del control para permitir solo selecciones individuales. Eso se puede hacer con el editor de recursos o mediante código.

Es posible que desee considerar el uso de una de las muchas clases de control de listas derivadas disponibles en este sitio. Yo uso este: CReportCtrl: una versión extremadamente conveniente de CListCtrl con estilo de informe[^].

Solución 1

Intentar:

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

Lo que debería establecer los dos bits de estado en cero.

Solución 3

Prueba esto. En tus funciones de OnCreate

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

コメント

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