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

posted @ 2015-10-17 14:46  01码匠  阅读(302)  评论(0编辑  收藏  举报