Pilih baris di clistctrl

pemrograman


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

Saya menggunakan kode ini untuk memilih baris di CListCtrl saya tetapi jika saya mengklik di CListCtrl saya, baris tersebut dipilih sehingga saya memiliki 2 baris yang dipilih..bagaimana cara membatalkan pilihan baris sebelum saya mengklik di daftar saya

Apa yang saya coba:

Saya mencoba menulis:

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

Saya mencoba juga

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

tapi saya tetap memilih 2 baris

….Saya memecahkan:

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

Solusi 2

Jika memilih dua baris merupakan masalah, maka atur properti kontrol untuk mengizinkan satu pilihan saja. Itu bisa dilakukan dengan editor sumber daya atau dalam kode.

Anda mungkin ingin mempertimbangkan untuk menggunakan salah satu dari banyak kelas kontrol daftar turunan yang tersedia di situs ini. Saya menggunakan yang ini: CReportCtrl – Versi CListCtrl bergaya laporan yang sangat nyaman[^].

Solusi 1

Mencoba:

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

Yang seharusnya menyetel dua bit status ke nol.

Solusi 3

Coba ini. Dalam fungsi OnCreate Anda

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

コメント

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