• [Q&A] C1DataGrid 奇葩的 BeginNewRow() 方法


    一、前言

    用户千千万,自然需求就千奇百怪都有,某天有人提了这样一个需求:

    某个 C1DataGrid 在 ScrollViewer 的底部(使纵向滚动条显示出来),然后当该 C1DataGrid 增加新行时(即手动调用 BeginNewRow() 方法),首先不能离开编辑状态,并且还要让滚动条自动滑动到顶部;

    本来这种需求很简单, C1DataGrid 的 BeginNewRow() 方法,再调用 ScrollViewer.ScrollToTop(); 就可以了;可怪异的问题就出现在这两句了, ScrollViewer.ScrollToTop(); 该语句无效,滚动条无法自动滑动到顶部……

    但是,

    你增加一个按钮,在按钮的点击事件里处理 ScrollViewer.ScrollToTop(); ,它就有效果,点击按钮后可以回滚到顶部,而且 C1DataGrid 仍处于编辑状态(虽然没有编辑光标)……

    然后,

    开始各种尝试,各种抓狂,各种砸键盘拍鼠标……

    最后,

    二、解决方案

    参考代码如下:

      1 C1DataGrid.BeginNewRow();
      2 C1DataGrid.UpdateLayout();
      3 ScrollViewer.ScrollToTop();

    第二行代码是关键,原因不明……理由没有……

    瞥了一眼 BeginNewRow 方法的注释说明,如下:

    QQ截图20151017142518

    也就是说 C1DataGrid 的BeginNewRow() 方法,不止会新增一行,而且还会自动滚动以显示当前编辑行;

    猜测是当进入单元格编辑状态时,占用了焦点,导致滚动条失效;

    于是我将第一行代码换成 C1DataGrid.EndEdit(false, true); 发现此时效果与 前言 中说的按钮点击效果一致(没有输入光标);所以就猜测当 C1DataGrid 的单元格进入编辑状态时,占用了某种句柄,导致外侧的滚动条失效,所以尝试使用 UpdateLayout 方法进行布局更新,看能不能释放掉那个句柄,结果,就对了……别问我为什么!!

  • 相关阅读:
    利用带关联子查询Update语句更新数据
    Marriage for Love
    Process Multiple Items respectively by commas!
    How to refresh current Form when thorugh X++ code influence
    Java SPI 机制分析
    浅谈微服务落地实践
    分布式事务之最大努力通知
    分布式事务之三阶段提交
    分布式事务之事务概念剖析
    SQL之树形查询结构设计
  • 原文地址:https://www.cnblogs.com/memento/p/4887510.html
Copyright © 2020-2023  润新知