본문 바로가기
프로그래밍/MFC (C++)

MFC ] 리스트 컨트롤에서 클릭된 아이템 값 가져오기

by eteo 2022. 7. 13.

 

1. 클릭된 인덱스 알아내기

 

리스트 컨트롤 자체의 멤버변수인 .GetSelectionMark(); 을 사용한다.

 

 

int clickindex = m_list.GetSelectionMark();

 

아무것도 안눌렸을 때는 -1 반환

 

 

 

리스트 컨트롤 오른쪽 클릭 후 이벤트 처리 함수 추가

 

클래스 목록을 주의해서 확인하고 NM_CLICK을 선택한다.

 

 

 

생성된 함수안에 아래와 같이 입력한다.

 

/*
void CbookManagerDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

	NM_LISTVIEW* pNMView = (NM_LISTVIEW*)pNMHDR;
	clicked_index = pNMView->iItem;

	*pResult = 0;
}
*/

clicked_index 는 함수 종료 후에도 값이 유지되어야 하므로 멤버변수로 만들었고 아무것도 클릭되지 않은 상태를 구분하기 위해 다이얼로그 생성자에서 -1로 초기화 해주었다.

 

 

 

 

 

2. 알아낸 인덱스로 값 가져오기

 

m_list.GetItemText(clickindex, 0);

 

위와 같이 리스트 컨트롤 변수의 .GetItemText() 함수를 사용하여 알아낼 수 있다. 첫번째 매개변수는 nItem 행, 두번째 매개변수는 nSubItem 열 이다. 첫번째 매개변수로 위에서 알아낸 인덱스를 입력한다.

 

 

 

 

리스트 컨트롤에서 선택된 행을 삭제 후 갱신하는 예시코드

void CbookManagerDlg::OnBnClickedButtondelete()
{

	UpdateData(true);

	int clickindex = m_list.GetSelectionMark();
	CMysqlController conn;
	CString temp;

	temp = _T("delete from TB_Book where id=");

	CString idNum = m_list.GetItemText(clickindex, 0);
	temp += idNum;

	if (conn.InsertQuery(LPSTR(LPCTSTR(temp))) == true)
	{
		AfxMessageBox(_T("성공"));

		RenewListControl();
	}
	else
	{
		AfxMessageBox(_T(" 실패"));
	}

	UpdateData(false);

}