界面上list 控件只显示数据库表中的3个字段,想要点击一行,数据刷新到界面的Edit 控件上,由于list只有3个字段,所有要直接从数据库表中取值显示到Edit 上。
问题是 在加载数据库表中的时候,如何判断是点击了list 的哪一行来加载?
void CSubjectDlg::OnNMClickListObject(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
POSITION pos = m_listObject.GetFirstSelectedItemPosition();
UINT nSel = m_listObject.GetNextSelectedItem(pos);//第 n 行 第0~N 列
m_szNumb = m_listObject.GetItemText(nSel, 0);
m_szChina = m_listObject.GetItemText(nSel, 1);
m_szEnglish = m_listObject.GetItemText(nSel, 2);
UpdateData(FALSE); // 内存到界面
if (!m_ado.Select(_T("SELECT * FROM t_item ")))
return;
CString str;
while (!m_ado.IsEOF()) //数据库到 界面中
{
// m_ado.Select(_T("SELECT * FROM t_item where f_ID =(‘nSel +1’)")); //这样写 不对
m_ado.GetFieldByIndex(9, str); //第一孵育
SetDlgItemText(IDC_BREED1, str);
m_ado.GetFieldByIndex(10, str); //第二孵育
SetDlgItemText(IDC_BREED2, str);
m_ado.GetFieldByIndex(11, str); //读数
SetDlgItemText(IDC_INTERAL, str);
m_ado.MoveNext();
}
*pResult = 0;
}
C++技术网解答
这个问题是比较简单的,问题就出在经验不足。m_ado.Select(参数),参数是一个字符串,字符串里的内容都是字符,不会当做变量,所以自然就无法起到变量的作用。 在数据库编程中,经常用到的就是格式化SQL语句。SQL语句以字符串形式传入,不过SQL语句的形成可以以各种形式拼接,根据不同的条件完成拼接,从而实现不同的条件执行不同的语句的目的。 本例中,就是根据选择的行号来组合成一个SQL语句。因为索引变量是整型,所以不能直接和字符串拼接,就需要使用字符串格式化方式拼接。在C语言中使用sprintf拼接到字符数组中,在C++语言中,可以参考《C++如何格式化字符串,超简单实现C++格式化字符串功能》。而在MFC中,我们可以利用强大的CString来完成,CString类的Format函数使用和printf差不多,非常方便。代码如下:
CString strSQL;//创建SQL语句字符串变量
strSQL.Format("SELECT * FROM t_item where f_ID = %d", nSel+1);//格式化拼接一个SQL语句
m_ado.Select(strSQL);//将SQL语句传入执行
所以,关键问题就在于字符串操作不熟练,多多练习。
开发中,为了拼接SQL语句的灵活,会根据各种条件拼接各种查询条件,而最开始的语句是这样的:
CString strSQL=_T("select * from user");
然后第一次根据条件判断,比如是否要添加年龄条件查询,如果需要则拼成这样的:
CString strAge = " age > 12";
strSQL.Format(_T("%s where %s"),strSQL,strAge);
这样一个strSQL的值为:"select * from user where age > 12"。这个足以说明拼接SQL语句的灵活性。至于其他的代码,就不做分析了。
感谢【wujunwei】提供的代码和【阿郎】提供的点击确定行号的方法,仅供参考,实际以程序结果为准。