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

  • 相关阅读:
    并发编程的核心问题
    线程池的作用
    结构化并发编程:并发编程的分解方式与组织形式
    Dispatch Group
    yii视频地址哦
    Redis--各个数据类型最大存储量
    php开发中处理emoji表情和颜文字的兼容问题
    面向对象的三个基本特征(讲解)
    详解Ajax请求(四)——多个异步请求的执行顺序
    red入门学习笔记
  • 原文地址:https://www.cnblogs.com/memento/p/4887510.html
Copyright © 2011-2022 走看看