2009-04-13 113 views
3

我有一個CEdit文本框是屬性窗格的一部分,只允許數值(正整數)。當人們輸入非數字值時,該框可以正常工作,但當他們刪除框中的值時,會彈出一個對話框: 「請輸入正整數。」CEdit數字驗證事件C++ MFC

這種情況:
1.我有一個數字(說20)在框中。
2.我刪除號碼。
3.我得到錯誤對話框。
有人能告訴我如何攔截此事件並在其中放置默認值?

這裏是我的屬性窗格的樣子:


const int DEFAULT_VALUE = 20; 

class MyPropertyPane:public CPropertyPane 
{ 
    //.... 
private: 
    CEdit m_NumericBox; 
    int m_value; 

    //.... 
public: 
    afx_msg void OnEnChangeNumericBox(); 

    //.... 
} 
void MyPropertyPane::MyPropertyPane() 
{ 
    // Set a default value 
    m_value = DEFAULT_VALUE; 
} 

//.... 
void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 

    // this sets the displayed value to 20 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 
} 

//.... 
void MyPropertyPane::OnEnChangeNumericBox() 
{ 
    // Somebody deleted the value in the box and I got an event 
    // saying that the value is changed. 

    // I try to get the value from the box by updating my data 
    UpdateData(TRUE); 

    // m_value is still 20 although the value is 
    // deleted inside the text box. 
} 

回答

7

您收到的消息從數據驗證程序,而不是數據交換程序來。有可能是在DoDataExchange中(這樣的調用):

void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 
    DDV_MinMaxInt(pDX, m_value, 1, 20); // if the value in m_value is outside the range 1-20, MFC will pop up an error dialog 
} 

您可以通過刪除解決這個問題,內置的MFC數據驗證並添加您自己:

void MyPropertyPane::DoDataExchange(CDataExchange* pDX) 
{ 
    DDX_Control(pDX, IDC_NUMERIC_BOX, m_NumericBox); 
    DDX_Text(pDX, IDC_NUMERIC_BOX, m_value); 

    if(m_value < 1 || m_value > 20) 
    { 
     m_value = DefaultValue; 
    } 
} 
+0

但m_value仍然是20後也已被刪除......所以檢查是否m_value <1將返回false和m_value不會被設置爲默認值。彈出錯誤「請輸入正整數」出現在OnChange事件之前。 – Kiril 2009-04-13 14:57:31

+0

實際上在DoDataExchange中修正它甚至不會超過DDX_Text(pDX,IDC_NUMERIC_BOX,m_value),所以它甚至不會觸及驗證代碼。 – Kiril 2009-04-13 15:00:49

0

約翰Dibling的提示使我該解決方案:


void MyPropertyPane::OnEnChangeNumericBox() 
{ 
    UpdateData(TRUE); 
    CString value; 
    m_NumericBox.GetWindowText(value); 
    if(value.IsEmpty()) 
    { 
     m_value = DEFAULT_VALUE; 
     UpdateData(FALSE); 
    } 
} 

唯一的驗證,我真的不得不這樣做是爲了檢查框包含一個值,因爲實際數字驗證已經被框處理。用戶不能輸入非數字值,但是他們可以刪除現有的值,這樣在數據交換功能中很難處理,我不得不「破解」OnChange事件。

+0

這在很多情況下都適用,但通常最好在DoDataExchange()函數中進行所有數據交換和驗證,因爲OnEnChangeNumericBox()可能不是m_value更改的唯一地方。例如,如果您有一個將m_value更改爲預設值的單選按鈕。 – 2009-04-13 15:49:28

0

這一個爲我工作

void CtimersDlg::OnEnChangeInterval() 
{ 
    CString value; //or use char * 
    CWnd *pWnd = GetDlgItem(IDC_INTERVAL);//IDC_EDITBOX 

    if(pWnd) 
    { 
     pWnd->GetWindowTextW(value); 
    } 

    int i = _wtoi(value); //if char * use _atol() 
    if((!value.IsEmpty())&& (i)) //To check i = 0 or 00 entered or not 
     UpdateData(TRUE); 
}