个人需求是网格自带的条件发生改变时(网格显示的内容会发生改变),同时需要刷新另一个网格的数据源,而另一个网格的数据源是走的这个网格的行焦点改变事件去刷新,自带的条件发生改变时并不会触发行焦点的改变
当前情况是系统里面,所有页面的网格都用的同一个封装的好的网格基类
由于页面过多,不可能在每个需要用到的页面去单独写代码调方法处理这个问题
方案1:
在封装的网格中,单独添加一个行焦点改变事件,外部去实现这个单独封装的事件,而不是走dev GridView原生事件,在网格内部,ColumnFilterChanged时,去调用基类定义的这个方法就可以了
还是同一个问题 页面过多 不可能一个个去调整页面的注册事件,改为自定义的行焦点改变事件
方案2:
找dev网格的方法,看他是怎么去调用自己的行焦点改变事件的,用同样的方法去调用就好了
看他的源码,发现在修改FocusedRowHandle 时,会去调用事件,但是有一个判断过不了,导致无法调用
知道怎么调用的事件了,那就好办了,想办法调用 RaiseFocusedRowChanged 这个方法就好了
可以看到这个方法是 protected 的,无法在外面直接调用,因为是封装的GridControl,而不是GridView
最终通过反射去取方法,手动调用
private void CurrentView_ColumnFilterChanged(object sender, EventArgs e)
{
var newRowHandle = 0;
// _currentView 当前网格的当前View视图
if (!_currentView.IsValidRowHandle(0))
{
newRowHandle = int.MinValue;
}
_currentView.GetType().GetMethod("RaiseFocusedRowChanged", BindingFlags.NonPublic | BindingFlags.Instance)?.Invoke(_currentView, new object[] { -1, newRowHandle });
}
当然应该还有其他的解决方案,有看到一个属性 Events,在外面注册事件委托时,是添加到了这个里面,想办法从这个里面拿到那个事件委托,也能够成功调用
问题解决,准备干饭