一、前言
用户千千万,自然需求就千奇百怪都有,某天有人提了这样一个需求:
某个 C1DataGrid 在 ScrollViewer 的底部(使纵向滚动条显示出来),然后当该 C1DataGrid 增加新行时(即手动调用 BeginNewRow() 方法),首先不能离开编辑状态,并且还要让滚动条自动滑动到顶部;
本来这种需求很简单, C1DataGrid 的 BeginNewRow() 方法,再调用 ScrollViewer.ScrollToTop(); 就可以了;可怪异的问题就出现在这两句了, ScrollViewer.ScrollToTop(); 该语句无效,滚动条无法自动滑动到顶部……
但是,
你增加一个按钮,在按钮的点击事件里处理 ScrollViewer.ScrollToTop(); ,它就有效果,点击按钮后可以回滚到顶部,而且 C1DataGrid 仍处于编辑状态(虽然没有编辑光标)……
然后,
开始各种尝试,各种抓狂,各种砸键盘拍鼠标……
最后,
二、解决方案
参考代码如下:
1 C1DataGrid.BeginNewRow(); 2 C1DataGrid.UpdateLayout(); 3 ScrollViewer.ScrollToTop();
第二行代码是关键,原因不明……理由没有……
瞥了一眼 BeginNewRow 方法的注释说明,如下:
也就是说 C1DataGrid 的BeginNewRow() 方法,不止会新增一行,而且还会自动滚动以显示当前编辑行;
猜测是当进入单元格编辑状态时,占用了焦点,导致滚动条失效;
于是我将第一行代码换成 C1DataGrid.EndEdit(false, true); 发现此时效果与 前言 中说的按钮点击效果一致(没有输入光标);所以就猜测当 C1DataGrid 的单元格进入编辑状态时,占用了某种句柄,导致外侧的滚动条失效,所以尝试使用 UpdateLayout 方法进行布局更新,看能不能释放掉那个句柄,结果,就对了……别问我为什么!!