秋枫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

CurrencyManager 类是从抽象类BindingManagerBase派生,当开发基于数据库的应用程序时,经常会在界面层进行数据绑定来显示数据库的数据,由此,通过注册BindingManagerBase.PositionChanged 事件来实现在显示的记录上下移动时进行操作,一般都通过PositionChanged 事件来更新菜单或工具栏的状态。但是有些的时候,如果不注意可能引起逻辑上思维上错误,下面就是这种情况。

假设DataGrid绑定了某个DataTableDataView。设置DataView.RowFilter = null,或DataView.RowFilter = String.Empty;显示了所有10条记录。假设当前记录的索引为0,也就是第一条,到DataView.RowFilter设置为其它条件进行过滤时,假设显示了5条记录,新的数据当前记录的索引还是为0(没有人为改变)。如果使用者刚好注册了.PositionChanged 事件来处理一些动作,那这个事件是不会触发的,当然这里可以通过代码直接调用事件处理程序。

private void Position_Changed(object sender, EventArgs e)

{

   // 处理代码

}

上面的步骤可能就会有问题存在,PositionChanged 事件虽然没有发生,但是过滤后5条记录中的索引为0的那条可能已经不是过滤前10条记录中索引为0的那条了。如果针对当前记录进行处理的代码没有考虑这一点,那可能就会引起不容易发现的逻辑问题。
posted on 2005-10-31 12:04  秋枫  阅读(651)  评论(0编辑  收藏  举报