CurrencyManager 类是从抽象类BindingManagerBase派生,当开发基于数据库的应用程序时,经常会在界面层进行数据绑定来显示数据库的数据,由此,通过注册BindingManagerBase.PositionChanged 事件来实现在显示的记录上下移动时进行操作,一般都通过PositionChanged 事件来更新菜单或工具栏的状态。但是有些的时候,如果不注意可能引起逻辑上思维上错误,下面就是这种情况。
假设DataGrid绑定了某个DataTable的DataView。设置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 的那条了。如果针对当前记录进行处理的代码没有考虑这一点,那可能就会引起不容易发现的逻辑问题。