zoukankan      html  css  js  c++  java
  • cxGrid自动保存当前单元格输入的数据

    遇到的问题,利用cxGrid做数据录入界面,当用户在一个单元格中录入数据,没有回车,然后直接点工具条上的保存按钮,执行数据提交,结果当前输入的内容丢掉了,又回到输入前的值。

    在群中求助,得到好多朋友的支持,这里先感谢了,最终明白大家的说法,并成功解决掉了这个问题。

    在这种情况下,与cxGrid的实现机制有关系,也就是说,点击工具条上的按钮,没有发生焦点变换,这时候cxGrid认为自己的用户没有输入完成,继续等用户输入。

    理解了这种情况,有一种解决方法,就是在点保存按钮时,强制调用Self.SetFocus,这里Self指Form;另外一种解决方法,就是调用cxGrid提供方法,强制提交数据。

    看下面的代码,按大家的提法,有很多写法:

    procedure Tsys_AddressBTDoc.UpdateData(aTableView: TcxGridDBTableView);
    var
      AValue:Variant;
    begin
      if aTableView.DataController.IsEditing then
      begin
        //这是一种方法
        //AValue:=TcxCustomTextEdit(aTableView.DataController.Controller.EditingController.Edit).Text;
        //aTableView.dataController.DataSet.Edit;
        //aTableView.dataController.DataSet.FieldByName('fname').AsString:=AValue;
        //aTableView.dataController.DataSet.Post;
    
        //这是一种方法
        //aTableView.Controller.EditingController.HideEdit(True);
    
        //这是一种方法
        //aTableView.Controller.EditingController.Edit.PostEditValue;
    
        //这是一种方法
        //aTableView.dataController.DataSet.Post;
    
        //这是一种方法
        aTableView.dataController.UpdateData;
      end;
    end;

    参数是cxGrid的一个视图。如下图,指ShiTableView。

    当点击保存按钮,执行这个方法,强制cxGrid提交数据。

    UpdateData(ShiTableView);

    写出这样的结果,看似简单,我确用了好几个小时,因为产生一种现象,就是用户第一次输入,执行上面的动作,数据得不到保存,第二次及以后则正常。最后查明,原来我的ShiTableView还使用了事件:ShiTableViewFocusedRecordChanged

    在这个事件上,我做了调入其他cxGrid需要的数据,正是这个事件造成第一次执行错误。用代码在执行UpdateData前去掉这个事件,执行后再恢复事件。最终的代码变成这样:

    procedure Tsys_AddressBTDoc.actSaveExecute(Sender: TObject);
    begin
    
      DisableFocusedRecordChanged;
      try
         //Self.SetFocus;//这是一种强制保存当前cxGrid输入的内容的方法
         UpdateData(ShiTableView); //这是一种强制保存当前cxGrid输入的内容的方法
         Save;
      finally
         EnableFocusedRecordChanged;
      end;
    
    end;

    最终,还有一点要说明,SetFocus与UpdateData的区别:

    如果用SetFocus,会使cxGrid没有了焦点,用户要继续操作cxGrid,就需要mouse点击一下,让cxGrid重新得到焦点,对于连续输入来说,不方便。而UpdateData方法,要写更多的代码,使得代码偶合增加,有利有憋,自己把握了!我最后用的UpdateData方法。

    这是最后完成的界面:

    再一次感谢群友们的指导与帮助!

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/13356356.html
Copyright © 2011-2022 走看看