Chọn hàng trong clistctrl

lập trình


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

Tôi đã sử dụng mã này để chọn một hàng trong CListCtrl của mình nhưng nếu tôi nhấp vào CListCtrl thì hàng đó được chọn nên tôi có 2 hàng được chọn..làm cách nào để tôi có thể bỏ chọn một hàng trước khi nhấp vào danh sách của mình

Những gì tôi đã thử:

Tôi đã cố gắng viết:

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

Tôi cũng đã thử

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

nhưng dù sao tôi cũng đã chọn 2 hàng

….Tôi đã giải quyết:

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

Giải pháp 2

Nếu có vấn đề khi chọn hai hàng thì hãy đặt thuộc tính của điều khiển để chỉ cho phép các lựa chọn duy nhất. Điều đó có thể được thực hiện bằng trình soạn thảo tài nguyên hoặc bằng mã.

Bạn có thể muốn xem xét sử dụng một trong nhiều lớp kiểm soát danh sách dẫn xuất có sẵn tại trang này. Tôi sử dụng cái này: CReportCtrl – Phiên bản cực kỳ tiện lợi của CListCtrl kiểu báo cáo[^].

Giải pháp 1

Thử:

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

Cái nào sẽ đặt hai bit trạng thái về 0.

Giải pháp 3

Thử cái này xem sao. Trong các hàm OnCreate của bạn

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

コメント

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