none
PropertyGrid질문입니다!! RRS feed

  • 질문

  • 예를 들어서 환자의 신상정보만 Edit Control을 사용하여 입력받은후 이것을 List Control에 순번대로 아이탬을 저장하고 각 아이탬을 누르게 되면

    Property Grid에 각각 신상정보(이름, 성별, 생년월일)가 나타나도록 하고 수정이 가능한 프로그램을 제작중입니다. 일단 환자의 정보를 입력받아 List Control에 순차적으로 저장하고 이것을 삭제하는것 까지는 코딩을 완료하여 잘 동작중입니다.

    하지만 아이탬을 선택하면 ProPerty Grid에 정보를 나타나게 하고싶은데 일단

    void CproDlg::OnItemchangedListPatient(NMHDR *pNMHDR, LRESULT *pResult)
    {
     LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
     // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
     m_nSelectedPatient = pNMLV->iItem;
       
     
     *pResult = 0;
    }

    이 부분에서 List Control의 아이템을 m_nSelectedPatient 라는 변수가 받게되고

    제가 이전에 한 질문의 답변중에 환자정보를 얻어서 propertyGrid에 화면갱신을 하면 값을 얻을 수 있다는 답변을 받게되었습니다.

    void CproDlg::ShowPatient(Patient patient)
    {
      m_pGridInfo.RemoveAll();
         m_pGridInfo.EnableHeaderCtrl(FALSE);
         m_pGridInfo.SetVSDotNetLook();
         m_pGridInfo.EnableDescriptionArea(FALSE);

      CMFCPropertyGridProperty* pGroupInfo = new CMFCPropertyGridProperty(_T("환자정보"));

      pGroupInfo->AddSubItem(new CMFCPropertyGridProperty(_T("이름"),
                                    patient.strName,0));

      CMFCPropertyGridProperty* pSex = new CMFCPropertyGridProperty(_T("성별"),patient.strSex,0);
         pSex->AddOption(_T("남"));
         pSex->AddOption(_T("여"));
         pSex->AllowEdit(FALSE);
      pGroupInfo->AddSubItem(pSex);

         m_pGridInfo.AddProperty(pGroupInfo);

       pGroupInfo->AddSubItem(new CMFCPropertyGridProperty(_T("생년월일"),
                                    patient.strName,0));

      CMFCPropertyGridProperty* pGroupSick = new CMFCPropertyGridProperty(_T("증상 및 처방"));

      pGroupSick->AddSubItem(new CMFCPropertyGridProperty(_T("증상"),
                           patient.strSick,0));

         CMFCPropertyGridProperty* pM1 = new CMFCPropertyGridProperty(_T("처방약1"),patient.strMadi1,0);
      pM1->AddOption(_T("소화제1"));
         pM1->AddOption(_T("소화제2"));
         pM1->AddOption(_T("소화제3"));
         pM1->AllowEdit(FALSE);
         pGroupSick->AddSubItem(pM1);

      CMFCPropertyGridProperty* pM2 = new CMFCPropertyGridProperty(_T("처방약2"),patient.strMadi2,0);
      pM2->AddOption(_T("진통제1"));
         pM2->AddOption(_T("진통제2"));
         pM2->AddOption(_T("진통제3"));
         pM2->AllowEdit(FALSE);
         pGroupSick->AddSubItem(pM2);

      CMFCPropertyGridProperty* pM3 = new CMFCPropertyGridProperty(_T("처방약3"),patient.strMadi3,0);
      pM3->AddOption(_T("항생제1"));
         pM3->AddOption(_T("항생제2"));
         pM3->AddOption(_T("항생제3"));
         pM3->AllowEdit(FALSE);
         pGroupSick->AddSubItem(pM3);

         pGroupSick->AddSubItem(new CMFCPropertyGridProperty(_T("투여일수"),
                           patient.strMadiday,0));

      pGroupSick->AddSubItem(new CMFCPropertyGridProperty(_T("주사처방"),
                           patient.strShot,0));

         CMFCPropertyGridProperty* pShotMadi = new CMFCPropertyGridProperty(_T("주사종류"),patient.strShottype,0);
         pShotMadi->AddOption(_T("진통제"));
         pShotMadi->AddOption(_T("해열제"));
         pShotMadi->AddOption(_T("항생제"));
         pShotMadi->AddOption(_T("기초수액"));
         pShotMadi->AddOption(_T("영양수액"));
         pShotMadi->AllowEdit(FALSE);
         pGroupSick->AddSubItem(pShotMadi);

      m_pGridInfo.AddProperty(pGroupSick);

      m_pGridInfo.UpdateData(FALSE);
    }

    일딴 이러한 코딩으로 PropertyGrid를 만들긴 하였는데 어떻게 화면에 갱신을 해주어야하는지 잘 모르겠습니다...

    어떻게 해야하나요


    • 편집됨 Reflaction 2016년 5월 16일 월요일 오후 12:02
    2016년 5월 16일 월요일 오전 11:26

답변

  • OnItemchangedListPatient 에서 현재 선택된 아이템 인덱스를 얻어올 수 있죠.

    그럼 리스트 컨트롤의 GetItemText 함수를 이용하여 각 컬럼의 값을 얻어온 뒤

    Patient 구조체를 만들어내서 ShowPatient 함수에 전달할 수 있을겁니다.

    만약 모든 환자 정보(Patient 구조체)를 메모리에 올려 관리하고 있다면

    선택된 아이템 인덱스를 이용해 선택된 환자에 대한 Patient 데이터에 접근하여 ShowPatient 함수에 전달할 수도 있을거구요.

    저 같은 경우에는 모든 환자에 대한 Patient 데이터를 vector 와 같은 컨테이너에 담아 관리하고

    리스트 컨트롤에 InsertItem 함수로 추가한 다음 Patient 데이터를 SetItemData 함수로 넣어주는 방식을 주로 사용합니다.

    이렇게 하면 현재 선택된 인덱스만 가지고도 GetItemData 함수로 Patient 데이터를 한 번에 얻어올 수 있기 때문입니다.

    • 답변으로 표시됨 Reflaction 2016년 5월 16일 월요일 오후 1:57
    2016년 5월 16일 월요일 오후 12:55

모든 응답

  • OnItemchangedListPatient 에서 현재 선택된 아이템 인덱스를 얻어올 수 있죠.

    그럼 리스트 컨트롤의 GetItemText 함수를 이용하여 각 컬럼의 값을 얻어온 뒤

    Patient 구조체를 만들어내서 ShowPatient 함수에 전달할 수 있을겁니다.

    만약 모든 환자 정보(Patient 구조체)를 메모리에 올려 관리하고 있다면

    선택된 아이템 인덱스를 이용해 선택된 환자에 대한 Patient 데이터에 접근하여 ShowPatient 함수에 전달할 수도 있을거구요.

    저 같은 경우에는 모든 환자에 대한 Patient 데이터를 vector 와 같은 컨테이너에 담아 관리하고

    리스트 컨트롤에 InsertItem 함수로 추가한 다음 Patient 데이터를 SetItemData 함수로 넣어주는 방식을 주로 사용합니다.

    이렇게 하면 현재 선택된 인덱스만 가지고도 GetItemData 함수로 Patient 데이터를 한 번에 얻어올 수 있기 때문입니다.

    • 답변으로 표시됨 Reflaction 2016년 5월 16일 월요일 오후 1:57
    2016년 5월 16일 월요일 오후 12:55
  • 감사합니다~

    2016년 5월 16일 월요일 오후 1:57
  • 정말 죄송하지만 하나만 더 질문하겠습니다 ㅜㅜ

    선택한 아이템의 인덱스가 젤 위의코딩 m_nSelectedPatient = pNMLV->iItem;에서 얻어지는데

    이걸 ShowPatient함수에 어떻게 전달을 해야되는건가요...예를들어 이름을 저장하고 싶을때는 ShowPatient함수에서

    pGroupInfo->AddSubItem(new CMFCPropertyGridProperty(_T("이름"), patient.strName,0)); 라는 구문에서

    patient.strName이라는 포인터가 PropertyGrid의 이름을 담당하는것이라 이것에 전달해야되는건가요?

    patient.strName = m_List.GetItemText(m_nSelectedPatient,0); 이라고 코딩을 하니 아무런 반응이없어서

    데이터를 다른방식으로 넘겨야하는지를 모르겠습니다...독학하려고 하니 힘드네요ㅠㅠ

    아 그리고

    만약 모든 환자 정보(Patient 구조체)를 메모리에 올려 관리하고 있다면 ->이말은 어떤뜻인지 모르겠네요

    일단 대화상자의 헤더파일에 구조체선언만 해두고 따로 코딩같은것은 하지않은상태입니다.

    • 편집됨 Reflaction 2016년 5월 16일 월요일 오후 2:42
    2016년 5월 16일 월요일 오후 2:37