Devexpress GridControl 内部调用外面实现的FocusedRowChanged

个人需求是网格自带的条件发生改变时(网格显示的内容会发生改变),同时需要刷新另一个网格的数据源,而另一个网格的数据源是走的这个网格的行焦点改变事件去刷新,自带的条件发生改变时并不会触发行焦点的改变

当前情况是系统里面,所有页面的网格都用的同一个封装的好的网格基类
由于页面过多,不可能在每个需要用到的页面去单独写代码调方法处理这个问题

方案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,在外面注册事件委托时,是添加到了这个里面,想办法从这个里面拿到那个事件委托,也能够成功调用

问题解决,准备干饭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值