DELPHI中,用ADOQUERY作数据源,用DBGRID呈现数据,如何感应到DBGRID中的数据已经改变? 
比如说字段 A,B,C 
在A字段为 X 的情况下,如果修改了B字段,则自动取消修改 
如何实现? 
请帮忙,谢谢

解决方案 »

  1.   

    重复帖在字段的OnSetText事件或beforePost事件中都可以处理
      

  2.   

    你的意思应该是怎么刷新数据?
    adoquery1.close;
    adoquery.open;
      

  3.   

    我是刚刚学的 这段代码可以用
    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, DBTables, Menus, StdCtrls, Buttons, Grids, DBGrids, ADODB,
      ExcelXP, OleServer;type
      TMainForm = class(TForm)
        DBGrid1: TDBGrid;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        BitBtn2: TBitBtn;
        BitBtn4: TBitBtn;
        Label3: TLabel;
        BitBtn6: TBitBtn;
        BitBtn5: TBitBtn;
        BitBtn1: TBitBtn;
        BitBtn3: TBitBtn;
        ExcelApplication1: TExcelApplication;
        ExcelWorksheet1: TExcelWorksheet;
        ExcelWorkbook1: TExcelWorkbook;
        BitBtn7: TBitBtn;
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn6Click(Sender: TObject);
        procedure BitBtn4Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn5Click(Sender: TObject);
        procedure BitBtn7Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;implementation{$R *.dfm}//刷新数据
    procedure TMainForm.BitBtn1Click(Sender: TObject);
    begin
       with ADOQuery1 do
       begin
          Close;
          SQL.Clear;
          SQL.Add('select id as 学号,userid as 学生姓名,username as 课程代号,');
          SQL.Add('logindate as 卷面成绩,logintime as 平时成绩,quittime as 实验参加次数,');
          SQL.Add('rights as 总实验次数,number as 综合成绩 from userlogin');
          Open;
       end;
    end;//连接后台数据库
    procedure TMainForm.BitBtn2Click(Sender: TObject);
    begin
       MainForm.ADOConnection1.Connected:=True;//连接后台数据库
       if  MainForm.ADOConnection1.Connected=False then //如果连接失败
       begin
          MessageDlg('系统连接后台数据库失败。请'+#13+#10+
                    ''+#13+#10+'检查数据库网络配置是否完好!',
                    mtWarning,[mbYes],0);
          Application.Terminate;//应用程序退出
       end
      else
       begin
          MessageDlg('系统已成功连接后台数据库!',mtInformation,[mbYes],0);
       end;
       BitBtn2.Enabled:=False;//设置组件的使能状态
       BitBtn3.Enabled:=True;
    end;//断开数据库连接
    procedure TMainForm.BitBtn3Click(Sender: TObject);
    begin
       ADOConnection1.Connected:=False;
       BitBtn2.Enabled:=True;
       BitBtn3.Enabled:=False;
    end;//连接数据库时显示登陆提示
    procedure TMainForm.BitBtn4Click(Sender: TObject);
    begin
       ADOConnection1.LoginPrompt:=True;
       BitBtn4.Enabled:=False;
       BitBtn5.Enabled:=True;
    end;//连接数据库时不显示登陆提示
    procedure TMainForm.BitBtn5Click(Sender: TObject);
    begin
       ADOConnection1.LoginPrompt:=False;
       BitBtn4.Enabled:=True;
       BitBtn5.Enabled:=False;
    end;//退出
    procedure TMainForm.BitBtn6Click(Sender: TObject);
    begin
       Close;
    end;
      

  4.   

    同意1楼观点,在beforepost事件中可以处理,
    不过个人建议,如果不好控制还是不要在DBGRID中直接修改数据比较好。
      

  5.   

    在字段的OnSetText事件或beforePost事件中都可以处理
      

  6.   

    这个嘛~~
      if filedByName['A'].value = 'X' then
        Dbgird.Options = dbgrid1.Options - [dgEditing] 
      else Dbgird.Options = dbgrid1.Options + [dgEditing];
     
     原理就是判断值等不等于'X' 然后就把Dbgrid的可编辑属性开或关 就行了 楼主明白了吧
      给分吧!!! 穷啊!
      

  7.   

    如果想在浏览状态下不能修改的话.把bdgrid.readonly:=true
    那么在数据源state in [dsinsert,dsedit]可以修改bdgrid中字段对应的值
      

  8.   

    beforedit
    if adoquery1.filedByName('A')value = 'X' then Abort;