⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap10_7.htm

📁 VC++编程实例。非常详细
💻 HTM
📖 第 1 页 / 共 4 页
字号:
          </b> 
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">void CSectionForm::OnRecordAdd()</p>
          <p align="JUSTIFY">{</p>
           
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY"> if (m_bAddMode) 
            //如果已处于添加模式,则完成添加操作</p>
           
          <p align="JUSTIFY">OnMove(ID_RECORD_FIRST);</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">CString strCurrentCourse = m_pSet-&gt;m_CourseID;</p>
          <p align="JUSTIFY">m_pSet-&gt;AddNew();</p>
          <p align="JUSTIFY">m_pSet-&gt;SetFieldNull(&amp;(m_pSet-&gt;m_CourseID), 
            FALSE);</p>
          <p align="JUSTIFY">m_pSet-&gt;m_CourseID = strCurrentCourse;</p>
          <p align="JUSTIFY">m_bAddMode = TRUE;</p>
          <p align="JUSTIFY">m_ctlSection.SetReadOnly(FALSE);</p>
          </b> 
          <p align="JUSTIFY"><b>UpdateData(FALSE); 
            //更新表单视图</b></p>
           
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">void CSectionForm::OnRecordDelete()</p>
          <p align="JUSTIFY">{</p>
           
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY">TRY</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">m_pSet-&gt;Delete();</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">CATCH(CDBException, e)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">AfxMessageBox(e-&gt;m_strError);</p>
          <p align="JUSTIFY">return;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">END_CATCH</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY"> m_pSet-&gt;MoveNext(); 
            //滚动到下一个记录</p>
          <p align="JUSTIFY"> if (m_pSet-&gt;IsEOF()) 
            //如果滚出了记录集的边界,则滚动到最后一个记录</p>
           
          <p align="JUSTIFY">m_pSet-&gt;MoveLast();</p>
           
          <p align="JUSTIFY">if (m_pSet-&gt;IsBOF()) 
            //如果记录变空了,则清除域数据成员</p>
           
          <p align="JUSTIFY">m_pSet-&gt;SetFieldNull(NULL);</p>
          </b> 
          <p align="JUSTIFY"><b>UpdateData(FALSE); 
            //更新表单视图</b></p>
           
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">void CSectionForm::OnRecordRefresh()</p>
          <p align="JUSTIFY">{</p>
           
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY">if (m_bAddMode == TRUE)</p>
          <p align="JUSTIFY">{</p>
           
          <p align="JUSTIFY">m_pSet-&gt;Move(AFX_MOVE_REFRESH); 
            //取消添加模式</p>
           
          <p align="JUSTIFY">m_ctlSection.SetReadOnly(TRUE);</p>
          <p align="JUSTIFY">m_bAddMode = FALSE;</p>
          <p align="JUSTIFY">}</p>
          </b> 
          <p align="JUSTIFY"><b>UpdateData(FALSE); 
            //更新表单视图</b></p>
           
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
           
          <p align="JUSTIFY">BOOL CSectionForm::OnMove(UINT nIDMoveCommand)</p>
          <p align="JUSTIFY">{</p>
           
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY">if (m_bAddMode)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">if (!UpdateData())</p>
          <p align="JUSTIFY">return FALSE;</p>
          <p align="JUSTIFY">TRY</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">m_pSet-&gt;Update();</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">CATCH(CDBException, e)</p>
          <p align="JUSTIFY">{</p>
          <p align="JUSTIFY">AfxMessageBox(e-&gt;m_strError);</p>
          <p align="JUSTIFY">return FALSE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">END_CATCH</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY"> m_pSet-&gt;Requery(); 
            //重新查询,使新加的记录对用户可见</p>
           
          <p align="JUSTIFY">UpdateData(FALSE);</p>
          <p align="JUSTIFY">m_ctlSection.SetReadOnly(TRUE);</p>
          <p align="JUSTIFY">m_bAddMode = FALSE;</p>
          <p align="JUSTIFY">return TRUE;</p>
          <p align="JUSTIFY">}</p>
          <p align="JUSTIFY">else</p>
          <p align="JUSTIFY">{</p>
          </b> 
          <p align="JUSTIFY">return CRecordView::OnMove(nIDMoveCommand);</p>
           
          <p><b> </b></p>
          <b> 
          <p align="JUSTIFY">}</p>
          </b> 
          <p align="JUSTIFY">}</p>
           
          <p align="JUSTIFY"> </p>
          <p align="JUSTIFY">  </p>
          <p align="JUSTIFY"> 我们先来看看Add命令的处理函数CSectionForm::OnRecordAdd函数。在该函数中,最重要的代码是调用CRecordset::AddNew进入添加模式。其余代码的解释如下:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">如果已处于添加模式,则调用CSectionForm::OnMove滚动到别的记录上,这导致新记录被保存到数据源中。通过滚动到别的记录上来完成添加操作是一种常用的方法。其实,缺省的CRecordView::OnMove就可以完成这一功能(参见10.5.6和10.6),但CSectionForm::OnMove有另外的考虑(见下面的说明)。</p>
              <p align="JUSTIFY">保存当前记录的CourseID,并将它作为新记录的缺省值。</p>
              <p align="JUSTIFY">调用CEdit::SetReadOnly(FALSE)把Section编辑框改成可输入的,以便用户输入新的值。</p>
            </blockquote>
          </blockquote>
          <p> </p>
          <p align="JUSTIFY"> CSectionForm::OnMove负责处理滚动命令。与缺省的CRecordView::OnMove函数不同的是,该函数对于添加模式下的滚动进行了重新处理:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">在调用CRecordset::Update把新记录保存到数据源后,调用CRecordset::Requery重新查询记录集。这样做的原因是Enroll使用的是快照型记录集,快照不反映用户添加的记录,所以需要调用Requery重新查询以把新加的记录包含进记录集中。在调用Requery后,会自动滚动到第一个记录上,所以在添加模式下滚动记录总是滚动动到第一个记录上。</p>
              <p align="JUSTIFY">在调用CRecordset::Update时,对可能发生的异常进行了处理。这里将直接输出异常信息。</p>
              <p align="JUSTIFY">在调用Requery后,要调用CRecordView::UpdateData(FALSE)来更新表单,并调用CEdit::SetReadOnly(TRUE)使Sectioin编辑框变成只读的。</p>
            </blockquote>
          </blockquote>
          <p> </p>
          <p align="JUSTIFY"> 在Delete命令的处理函数CSectionForm::OnDelete中调用了CRecordset::Delete来删除记录,并对可能发生的异常进行了处理。在调用Delete后,滚动记录到新的位置上以跳过被删除的记录。</p>
          <p align="JUSTIFY"> Refresh命令的处理函数CSectionForm::OnRefresh用来放弃修改或添加记录的操作。对该函数的解释为:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">如果当前处于添加模式,则调用CRecordset::Move(AFX_MOVE_REFRESH)取消添加模式并恢复域数据成员的原值(参见10.5.6),把Section编辑框设置成只读的。</p>
              <p align="JUSTIFY">调用CRecordView::UpdateData(FALSE)恢复表单视图中的记录。</p>
            </blockquote>
          </blockquote>
          <p align="JUSTIFY">CSectionForm::OnSelendokCourselist函数中多了一个用来判断当前是否处于添加模式的if语句。如果处于添加模式,那么就不能调用Requery重新查询,因为此时Course组合框的作用仅仅是让用户选择一个字段值,而不是指定过滤器。</p>
          <p align="JUSTIFY"> 编译并运行Enroll,试试新增加的功能。</p>
          <div align="center"> 
            <center>
              <table border="0" cellpadding="0" cellspacing="0" width="615">
                <tr> 
                  <td><a href="chap10_6.htm">上一页</a></td>
                  <td> 
                    <p align="right"><a href="chap10_8.htm">下一页</a> 
                  </td>
                </tr>
              </table>
              <p><a href="http://www.cpcw.com">电脑报首页</a> <a href="../../index.htm">网络学院首页</a></p>
            </center>
          </div>
          <hr noshade color="#3973DE" size="1">
           
          <p align="center">本教程由<a href="http://vcdynasty.yeah.net">Visual C++王朝(Where 
            programmers come together)</a>协助制作<br>
            未经许可,请勿以任何形式复制 
        </td>
      </tr>
    </table>
    </center>
</div>

</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -