起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 177|回复: 8

【结贴】[请求]datagrid下的oneditchange事件不触发**

[复制链接]
发表于 2007-10-11 11:13:10 | 显示全部楼层 |阅读模式
datagrid下的oneditchange事件不触发?
我想实现这样的:就是图片上的checkbox选择列勾选上的时候,上面的文字跟着显示出‘已选择几匹几KG’

outfrom.jpg

66.18 KB, 下载次数: 134

回复

使用道具 举报

 楼主| 发表于 2007-10-11 11:15:42 | 显示全部楼层
这边我是在onedited里面触发的   
代码大致如下:

procedure TFPD_LOADJOBCARD_FORM.DataGrid2Edited(Sender: TObject; Node: TTreeListNode);
var changexz:string;
begin

//dialogs.ShowMessage(datagrid1.FocusedField.FieldName);
if  (datagrid1.FocusedField.FieldName='XZ') then
begin
  changexz:=datasetfpddetail.FieldByname('xz').AsString;
  if  (datasetfpddetail.FieldByname('xz').AsBoolean=false) and  (changexz<>orgxz) then
     begin
      selpn:=selpn-datasetfpddetail.FieldByName('pn').AsInteger;
      selkg:=selkg-datasetfpddetail.FieldByName('kg').Asfloat;
     end
     else
     if  (datasetfpddetail.FieldByname('xz').AsBoolean=true) and  (changexz<>orgxz) then
     begin
      selpn:=selpn+datasetfpddetail.FieldByName('pn').AsInteger;
      selkg:=selkg+datasetfpddetail.FieldByName('kg').Asfloat;
     end;
     ltext.Caption:='       已选'+sysUtils.inttostr(selpn)+'匹,'+sysUtils.floattostr(selkg)+'KG';
      datasetfpddetail.edit;
      datasetfpddetail.post;

end              ;

end;

procedure TFPD_LOADJOBCARD_FORM.DataGrid2Editing(Sender: TObject; Node: TTreeListNode; var Allow: Boolean);
begin

if  not datasetfpddetail.IsEmpty then
begin
  orgxz:=datasetfpddetail.FieldByname('xz').AsString;
  dialogs.ShowMessage('orgxz');
end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-11 11:17:31 | 显示全部楼层
在onedited要等一下焦点转移的时候才会显示我刚勾选的那匹,我把代码写在oneditchange中 可是不触发,有没有别的办法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-11 17:23:31 | 显示全部楼层
怎么没人理我
回复 支持 反对

使用道具 举报

发表于 2007-10-12 09:09:54 | 显示全部楼层
楼主可否考虑不使用checkbox,因为现在没有那个事件是在改变grid里面的checkbox的状态后立即触发,都是当焦点离开的时候触发。
楼主可否考虑就把这个checkbox字段当成一个标记字段比如就存储0和1 ,然后在字段的onbuttonclick事件中首先改变标记位的状态,然后在进行统计输出,比如:
unit MainForm;

interface

uses
  Business.System, Business.Model, Business.Forms, Business.Data;

type
  TMainForm = class(TForm)
    FuncBroker: TFuncBroker;
    InfoBrokerYWXX1: TInfoBroker;
    ControlBar: TControlBar;
    DataNavigator: TDataNavigator;
    DocViewBar: TDocViewBar;
    Panel: TPanel;
    DocViewYWXX1_SJWG1: TDocView;
    DataSetBroker1: TDataSetBroker;
    procedure BizFormCreate(Sender: TObject);
  private
    procedure FIELDClick(Sender: TObject);
  public
    {public declarations}
  end;

implementation

procedure TMainForm.FIELDClick(Sender: TObject);
begin
  if datasetbroker1.dataset.state <> tdatasetstate.dsEdit then
    datasetbroker1.dataset.edit;
  datasetbroker1.dataset.Fieldbyname('zd4').AsBoolean := not datasetbroker1.dataset.Fieldbyname('zd4').AsBoolean;
  //IF datasetbroker1.dataset.Fieldbyname('zd4').AsBoolean THEN
    dialogs.ShowMessage(SELF.CAPTION);   //然后是具体的统计过程
end;

procedure TMainForm.BizFormCreate(Sender: TObject);
begin
  TSqlDataSet(DataSetBroker1.DataSet).BizFieldByName('ZD4').OnButtonClick := FIELDClick;
end;
在功能窗体中使用事件赋值的方法事件字段的点击事件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 09:56:28 | 显示全部楼层
标记字段比如就存储0和1?那表现形式不能为checkbox了吗?
回复 支持 反对

使用道具 举报

发表于 2007-10-12 11:46:23 | 显示全部楼层
楼主,现在的问题是在你通过单击修改了checkbox状态后,没有合适的事件马上捕获(即判断是否被选中),所以建议你用OnButtonClick事件来替代。

用OnButtonClick后,不能直接修改CheckBox的选择状态,所以建议你在事件中修改数据集字段的值。

最好再设置一个枚举类型的查找属性,0和1,用来控制不要用户手工输入非法数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 15:05:30 | 显示全部楼层
哎  算了  偶自己再想想办法   仍然感谢!
回复 支持 反对

使用道具 举报

发表于 2007-10-15 16:57:26 | 显示全部楼层
如果离开焦点后再统计会好很多。因为刚选择后,甚至还没有post到数据集,即使从数据集访问也是访问不到实际字段值的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-28 17:24 , Processed in 0.044699 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表