zoukankan      html  css  js  c++  java
  • [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 方法进行布局更新,看能不能释放掉那个句柄,结果,就对了……别问我为什么!!

  • 相关阅读:
    5.MFC基础(五)视图、运行时类信息、动态创建
    4.MFC基础(四)菜单、工具栏、状态栏
    OpenCV Python 4.0安装
    windows批量导出文件名到txt
    *&p理解
    VS调试快捷键配置更改
    数组类的创建(下)
    数组类的创建(上)
    operator用法:隐式类型转换
    C++单例模式
  • 原文地址:https://www.cnblogs.com/memento/p/4887510.html
Copyright © 2011-2022 走看看