Dialog 中多個 Edit Control 通過 Class Wizard 綁定 CString 變量(DDX_Text),按鈕事件中讀取變量值均為空字符串。
MFC 的 DDX(對話框數據交換)機制不會自動將控件內容同步到變量。必須在讀取前調用 UpdateData(TRUE)(控件 → 變量),寫入後調用 UpdateData(FALSE)(變量 → 控件)。
void CAddBookDlg::OnBnClickedOk()
{
UpdateData(TRUE); // 關鍵:從控件獲取數據到變量
// 現在 m_bookName, m_Writer 等已有用戶輸入的值
CString sql;
sql.Format(_T("INSERT INTO Books VALUES ('%s', '%s', ...)"), m_bookName, m_Writer);
// ... 執行 SQL
UpdateData(FALSE); // 如需清空或回顯
CDialogEx::OnOK();
}
OnInitDialog 中調用 UpdateData(FALSE) 初始化控件,卻忘記讀取時調 TRUE。DDX_Text(文本框)與 DDX_Control(控件指針),後者需 GetWindowText 手動取值。GetDlgData() / SetDlgData() 統一調用。OnOK 中 UpdateData(TRUE) 後進行,失敗則 return 不關閉對話框。博客園 MFC UpdateData 詳細講解。