MFC List Control控制項添加儲存格編輯和儲存格下拉式清單項以適用於資料庫相關操作

來源:互聯網
上載者:User

標籤:mfc   資料庫   list control控制項   儲存格編輯   儲存格下拉式清單   

        作為現代的軟體,往往是連著資料庫的,而連著和使用者方便地操作之間,還有著介面這道坎。MFC是Windows上比較好開發使用者介面的架構,然而其內建的控制項中沒有對於資料庫表格支援較好的控制項,而使用網上提到的 DataGrid 等控制項在本人的win8.1+VS2013平台上老出現找不到控制項或者標頭檔的問題,搞的煩死人。最後想到 List Control 控制項只要稍作修改,加上單元格編輯和單元格下拉式清單,其實就能和資料庫進行良好的對接,一百度,果然有人已經做了這件事,實在是太讓人感動了!       下面將介紹一下如何?上面提到的這兩個功能,由於是參考別人的,如果想看原文:請點擊這裡。至於跟原文最大的不同,我想是我把流程操作盡我所能寫的詳細,並最大化的簡化代碼,最後順帶加上一些本人覺得能給資料庫操作帶來方便的功能的實現方法上去。        OK,下面我們先來看單元格編輯框的添加吧。其實實現的原理很簡單,就是在點擊到列表相應單元格的時候,在相應的位置產生一個跟單元格大小相當的編輯框並貼在列表框單元格上面而已。        實現如下:        在對話方塊類聲明中添加如下變數和函數:
int e_Item;    //剛編輯的行  int e_SubItem; //剛編輯的列  CEdit m_Edit;  //產生單元編輯框對象bool haveeditcreate;//標誌編輯框已經被建立void createEdit(NM_LISTVIEW  *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat);//建立儲存格編輯框函數void distroyEdit(CListCtrl *list, CEdit* distroyedit, int &Item, int &SubItem);//銷毀儲存格編輯框對象CComboBox m_comBox;//生產儲存格下拉式清單對象bool haveccomboboxcreate;//標誌下拉式清單方塊已經被建立void createCcombobox(NM_LISTVIEW  *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat);//建立儲存格下拉式清單方塊函數void distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem);//銷毀儲存格下拉式清單方塊
           在對話方塊的初始化函數OnInitDialog()中添加初始化代碼如下:
haveeditcreate = false;//初始化標誌位,表示還沒有建立編輯框haveccomboboxcreate = false;//初始化標誌位,表示還沒有建立下拉式清單方塊RECT  m_rect;m_list.GetClientRect(&m_rect); //擷取list的客戶區,方便調節每一列的寬度  m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //設定list風格,LVS_EX_GRIDLINES為網格線(只適用與report風格的listctrl)  //LVS_EX_FULLROWSELECT為選中某行使整行高亮(只適用與report風格的listctrl)m_list.InsertColumn(0, _T("學號"), LVCFMT_LEFT, m_rect.right / 4);m_list.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, m_rect.right / 4);m_list.InsertColumn(2, _T("性別"), LVCFMT_LEFT, m_rect.right / 4);m_list.InsertColumn(3, _T("班級"), LVCFMT_LEFT, m_rect.right / 4);m_list.InsertItem(0, _T("09090901"));//添加第一個學生資料m_list.SetItemText(0, 1, _T("小李"));m_list.SetItemText(0, 2, _T("男"));m_list.SetItemText(0, 3, _T("計科0901"));m_list.InsertItem(1, _T("09090902"));//添加第二個學生資料m_list.SetItemText(1, 1, _T("小王"));m_list.SetItemText(1, 2, _T("男"));m_list.SetItemText(1, 3, _T("計科0902"));
        為列表框添加單擊響應函數:
void CNephoVisionDatabaseDlg::OnNMClickListStudentdata(NMHDR *pNMHDR, LRESULT *pResult){LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);NM_LISTVIEW  *pEditCtrl = (NM_LISTVIEW *)pNMHDR;printf("行:%d,列:%d\n", pEditCtrl->iItem, pEditCtrl->iSubItem);if (pEditCtrl->iItem==-1)//點擊到非工作區{if (haveeditcreate == true)//如果之前建立了編輯框就銷毀掉{distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);//銷毀儲存格編輯框對象haveeditcreate = false;}if (haveccomboboxcreate == true)//如果之前建立了下拉式清單方塊就銷毀掉{distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);haveccomboboxcreate = false;}}else if (pEditCtrl->iSubItem != 2)//如果不是性別選項{if (haveccomboboxcreate == true)//如果之前建立了編輯框就銷毀掉{distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);haveccomboboxcreate = false;}if (haveeditcreate == true){if (!(e_Item == pEditCtrl->iItem && e_SubItem == pEditCtrl->iSubItem))//如果點中的儲存格不是之前建立好的{distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);haveeditcreate = false;createEdit(pEditCtrl, &m_Edit, e_Item, e_SubItem, haveeditcreate);//建立編輯框}else//點中的儲存格是之前建立好的{m_Edit.SetFocus();//設定為焦點 }}else{e_Item = pEditCtrl->iItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理e_SubItem = pEditCtrl->iSubItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理createEdit(pEditCtrl, &m_Edit, e_Item, e_SubItem, haveeditcreate);//建立編輯框}}else//如果是性別選項,在儲存格處產生下拉式清單項{if (haveeditcreate == true)//如果之前建立了編輯框就銷毀掉{distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);haveeditcreate = false;}if (haveccomboboxcreate == true){if (!(e_Item == pEditCtrl->iItem && e_SubItem == pEditCtrl->iSubItem))//如果點中的儲存格不是之前建立好的{distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);haveccomboboxcreate = false;createCcombobox(pEditCtrl, &m_comBox, e_Item, e_SubItem, haveccomboboxcreate);//建立編輯框m_comBox.AddString(L"男");m_comBox.AddString(L"女");m_comBox.ShowDropDown();//自動下拉}else//點中的儲存格是之前建立好的{m_comBox.SetFocus();//設定為焦點 }}else{e_Item = pEditCtrl->iItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理e_SubItem = pEditCtrl->iSubItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理createCcombobox(pEditCtrl, &m_comBox, e_Item, e_SubItem, haveccomboboxcreate);//建立編輯框m_comBox.AddString(L"男");m_comBox.AddString(L"女");m_comBox.ShowDropDown();//自動下拉}}*pResult = 0;}
           寫建立與銷毀單元格編輯框和下拉式清單方塊函數的實現:
void CNephoVisionDatabaseDlg::createEdit(NM_LISTVIEW  *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat)//建立儲存格編輯框函數//pEditCtrl為列表對象指標,createdit為編輯框指標對象,//Item為建立儲存格在列表中的行,SubItem則為列,havecreat為對象建立標準{Item = pEditCtrl->iItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理SubItem = pEditCtrl->iSubItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理createdit->Create(ES_AUTOHSCROLL | WS_CHILD | ES_LEFT | ES_WANTRETURN,CRect(0, 0, 0, 0), this, IDC_EDIT_CREATEID);//建立編輯框對象,IDC_EDIT_CREATEID為控制項ID號3000,在文章開頭定義havecreat = true;createdit->SetFont(this->GetFont(), FALSE);//設定字型,不設定這裡的話上面的字會很突兀的感覺createdit->SetParent(&m_list);//將list control設定為父視窗,產生的Edit才能正確定位,這個也很重要CRect  EditRect;m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//擷取儲存格的空間位置資訊EditRect.SetRect(EditRect.left+1, EditRect.top+1, EditRect.left + m_list.GetColumnWidth(e_SubItem)-1, EditRect.bottom-1);//+1和-1可以讓編輯框不至於擋住列表框中的網格線CString strItem = m_list.GetItemText(e_Item, e_SubItem);//獲得相應儲存格字元createdit->SetWindowText(strItem);//將儲存格字元顯示在編輯框上createdit->MoveWindow(&EditRect);//將編輯框位置放在相應儲存格上createdit->ShowWindow(SW_SHOW);//顯示編輯框在儲存格上面createdit->SetFocus();//設定為焦點 createdit->SetSel(-1);//設定游標在文字框文字的最後}void CNephoVisionDatabaseDlg::distroyEdit(CListCtrl *list,CEdit* distroyedit, int &Item, int &SubItem){CString meditdata;distroyedit->GetWindowTextW(meditdata);list->SetItemText(Item, SubItem, meditdata);//獲得相應儲存格字元distroyedit->DestroyWindow();//銷毀對象,有建立就要有銷毀,不然會報錯}void CNephoVisionDatabaseDlg::createCcombobox(NM_LISTVIEW  *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat)//建立儲存格下拉式清單方塊函數//pEditCtrl為列表對象指標,createccombobox為下拉式清單方塊指標對象,//Item為建立儲存格在列表中的行,SubItem則為列,havecreat為對象建立標準{Item = pEditCtrl->iItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理SubItem = pEditCtrl->iSubItem;//將點中的儲存格的行賦值給“剛編輯過的行”以便後期處理havecreat = true;createccomboboxobj->Create(WS_CHILD | WS_VISIBLE |  CBS_DROPDOWN | CBS_OEMCONVERT, CRect(0, 0, 0, 0), this, IDC_COMBOX_CREATEID);createccomboboxobj->SetFont(this->GetFont(), FALSE);//設定字型,不設定這裡的話上面的字會很突兀的感覺createccomboboxobj->SetParent(&m_list);//將list control設定為父視窗,產生的Ccombobox才能正確定位,這個也很重要CRect  EditRect;m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//擷取儲存格的空間位置資訊EditRect.SetRect(EditRect.left + 1, EditRect.top + 1, EditRect.left + m_list.GetColumnWidth(e_SubItem) - 1, EditRect.bottom - 1);//+1和-1可以讓編輯框不至於擋住列表框中的網格線CString strItem = m_list.GetItemText(e_Item, e_SubItem);//獲得相應儲存格字元createccomboboxobj->SetWindowText(strItem);//將儲存格字元顯示在編輯框上createccomboboxobj->MoveWindow(&EditRect);//將編輯框位置放在相應儲存格上createccomboboxobj->ShowWindow(SW_SHOW);//顯示編輯框在儲存格上面}void CNephoVisionDatabaseDlg::distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem){CString meditdata;distroyccomboboxobj->GetWindowTextW(meditdata);list->SetItemText(Item, SubItem, meditdata);//更新相應儲存格字元distroyccomboboxobj->DestroyWindow();//銷毀對象,有建立就要有銷毀,不然會報錯}
        OK,到此我們已經實現了添加單元格編輯框和單元格下拉式清單方塊的功能了,點擊除性別列外的列表單元格看到以下效果:
        點擊性別列單元格則看到下拉式清單效果,如下:

        在單元格編輯框中寫東西的時候往往喜歡按斷行符號,這個時候如果不加處理的話會發現一個很崩潰的現象,程式直接退出了。這個可以重載對話方塊類的OnOK()函數來避免。就是在對話方塊類聲明中添加
afx_msg void OnOK();
            然後將其定義為什麼都不做:
void CNephoVisionDatabaseDlg::OnOK(){}
             這樣就不會有按斷行符號直接退出程式的事情發生了。

        此外,如果希望在編輯框擷取下拉式清單方塊失去焦點的時候就將資料列表中的相關資訊更新,可以響應動態建立的這兩個控制項的失去焦點訊息,方法如下:        在對話方塊類聲明中添加
afx_msg void OnKillfocusEdit();//動態產生編輯框失去焦點響應函數afx_msg void OnKillfocusCcomboBox();//動態產生下拉式清單方塊失去焦點響應函數
        在對話方塊類實現的訊息映射描述中添加
ON_EN_KILLFOCUS(IDC_EDIT_CREATEID, &CNephoVisionDatabaseDlg::OnKillfocusEdit)//添加動態產生編輯框的失去焦點響應函數ON_CBN_KILLFOCUS(IDC_COMBOX_CREATEID, &CNephoVisionDatabaseDlg::OnKillfocusCcomboBox)
             這樣這兩個控制項在失去焦點的時候就會響應分別定義好的函數,我們只需要在相應的函數添加處理代碼就可以了:
void CNephoVisionDatabaseDlg::OnKillfocusEdit(){if (haveeditcreate == true)//如果之前建立了編輯框就銷毀掉{distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);//銷毀儲存格編輯框對象haveeditcreate = false;}if (haveccomboboxcreate == true)//如果之前建立了下拉式清單方塊就銷毀掉{distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);haveccomboboxcreate = false;}}void CNephoVisionDatabaseDlg::OnKillfocusCcomboBox(){if (haveeditcreate == true)//如果之前建立了編輯框就銷毀掉{distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);//銷毀儲存格編輯框對象haveeditcreate = false;}if (haveccomboboxcreate == true)//如果之前建立了下拉式清單方塊就銷毀掉{distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);haveccomboboxcreate = false;}}












MFC List Control控制項添加儲存格編輯和儲存格下拉式清單項以適用於資料庫相關操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.