在 delphi 中编辑和更新 dbgrid 中的值

Edit and Update values in dbgrid in delphi

我是 delphi 的新手,我正在为客户创建一个数据库,我可以通过 Viewcustomers 按钮在 dbgrid 中填充他们的详细信息。但是我试图通过以下方式更新他们的详细信息:选择一行并更改单元格中的值并通过单击编辑按钮更新相同的值。

我可以通过选择行并以单独的形式提取数据来完成相同的操作。但我想更改 dbgrid 本身的值并更新。有人可以帮忙吗?更新了 TDB 导航器和 dgEnabled 属性。

a)MySQL b)TDatasource c) In a form, to update a customer i did like:

procedure TForm5.editCustomersButtonClick(Sender: TObject);
var i:integer;
begin
 for i:=0 to customersDataGrid.Columns.Count-1 do begin
  if customersDataGrid.Fields[i].FieldName='customerId' then 
        if customersDataGrid.Fields[i].FieldName='customerName' then customerNameValue.Text:=customersDataGrid.Fields[i].AsString;
        if customersDataGrid.Fields[i].FieldName='product' then productValue.Text:=customersDataGrid.Fields[i].AsString;
        if customersDataGrid.Fields[i].FieldName='city' then cityValue.Text:=customersDataGrid.Fields[i].AsString;
        if customersDataGrid.Fields[i].FieldName='country' then countryValue.Text:=customersDataGrid.Fields[i].AsString;
          begin
            try
              editCustomerQuery.Close;
              editCustomerQuery.Sql.Clear;
              editCustomerQuery.SQL.Add('UPDATE `employees_details`.`customers` SET `customerId`='''+customerIDValue1.Text+''', `customerName`='''+customerNameValue.Text+''', `product`='''+productValue.Text+''', `city`='''+cityValue.Text+''', `country`='''+countryValue.Text+''' WHERE `customerId`='+FloatToStr(customersDataGrid.Fields[i].AsFloat)+'');
              editCustomerQuery.Open;
              viewCustomerQuery.ApplyUpdates;
              viewCustomerQuery.Refresh;
              except on E : Exception do
            end;
          end;
        end;
        customerIDValue1.Text:='';
        customerNameValue.Text:='';
        productValue.Text:='';
        cityValue.Text:='';
        countryValue.Text:='';
        ShowMessage('Customer Changes have been updated in database');
        customersDataGrid.DataSource.DataSet.Refresh;
    end;

d) 只是在数据库演示中检查 TDBedit 的工作情况,它可以工作,但我创建了一个没有任何后端数据库的新项目,它仍然不允许我编辑。

是的,这是可能的。

最好将TDBNavigator 添加到您的表单并将其DataSource 设置为与网格相同的数据源。这样做的目的是,它为您提供了一种保存或取消编辑的简便方法,因为它有用于这些操作的按钮。

您应该会发现,如果您在网格中的某个单元格中单击两次,第一次单击会将其聚焦,第二次单击会将其置于编辑模式。然后,您可以就地编辑单元格值。如果您想避免单击单元格两次,请将 dgAlwaysShowEditor 设置为 True

顺便说一句,要在网格中启用就地编辑,值 dgEditing(在 Object Inspector 中网格的 Options 属性 下)需要 TruedgRowSelect 需要 False,网格的 ReadOnly 属性.

也是如此

如果您发现无法编辑您认为应该可编辑的列值,请尝试以下操作:

  • 如果您为数据集设置了持久性 TField,请检查 Object Inspector 中该列的 TField 以确保该字段未标记为只读。

  • 检查数据集没有设置为 True 的只读 属性。

  • 在表单上放置一个 TDBedit 并将其连接到数据集的一个字段。那会接受编辑吗。

  • 如果其中 none 有效,您只需要进行一些调试。使用调试器在 运行 时检查网格、字段和数据集的只读属性,以确保其中 none 为 True。或者开始一个新项目,该项目仅包含一个表单、一个数据集、数据集、dbgrid 和一个 dbnavigator,其属性设置如我所描述的:现在,您可以在其中进行就地编辑吗?

作为使用 DBNavigator 的 SaveCancel 按钮的替代方法,您可以简单地调用 DataSet.PostDataSet.Cancel.

我想我 post 这是一个新的答案,因为很明显我不是 回答和我想的一样的问题。以下是摘自 两个 D7 项目,它们提供 MySql table 的就地编辑 有一个 ID 列和两个 80 个字符宽的字符串列。两者都经过测试 并且工作正常。

摘录实际上来自项目的 DFM 文件,并显示 您需要的组件、如何连接它们以及您需要哪些属性 在 Object Inspector 中设置(IDE 给掉落的组件的默认值 Component Palette 的表格上的其余部分都可以。

没有代码需要添加到这些项目中:您需要做的就是将连接到 DataSource1 的数据集的 Active 属性 设置为True,即 DBExpress 的 CDS1 和 Zeos 的 ZQuery1

显然,您需要调整数据库名称、字段名称、用户名和 您数据库的密码。

DFM

使用 DBExpress 组件(D7 附带)

      object SQLConnection1: TSQLConnection
        ConnectionName = 'OpenMySQL50Connection'
        DriverName = 'OpenMySQL50'
        GetDriverFunc = 'getSQLDriverMYSQL50'
        LibraryName = 'dbxopenmysql50.dll'
        LoginPrompt = False
        Params.Strings = (
          'DriverName=OpenMySQL50'
          'HostName=LocalHost'
          'Database=MATestDB'
          'User_Name=sa'
          'Password='
          'BlobSize=-1')
        VendorLib = 'libmysql.dll'
      end
      object SQLQuery1: TSQLQuery
        GetMetadata = True
        MaxBlobSize = -1
        Params = <>
        SQL.Strings = (
          'select * from MATable1')
        SQLConnection = SQLConnection1
        object SQLQuery1Table1ID: TIntegerField
          FieldName = 'Table1ID'
          Required = True
        end
        object SQLQuery1AName: TStringField
          FieldName = 'AName'
          Size = 80
        end
        object SQLQuery1AValue: TStringField
          FieldName = 'AValue'
          Size = 80
        end
      end
      object DataSetProvider1: TDataSetProvider
        DataSet = SQLQuery1
      end
      object CDS1: TClientDataSet
        Aggregates = <>
        Params = <>
        ProviderName = 'DataSetProvider1'
      end
      object DataSource1: TDataSource
        DataSet = CDS1
      end
      object DBGrid1: TDBGrid
        DataSource = DataSource1
      end
      object DBNavigator1: TDBNavigator
        DataSource = DataSource1
        Align = alBottom
        TabOrder = 1
      end

使用 ZEOS 组件(可从 SourecForge.Net 获得)

      object ZConnection1: TZConnection
        ControlsCodePage = cGET_ACP
        AutoEncodeStrings = False
        Connected = True
        DesignConnection = True
        SQLHourGlass = True
        HostName = 'localhost'
        Port = 0
        Database = 'MATestDB'
        User = 'sa'
        Protocol = 'mysql'
        LibraryLocation = 'D:\aaad7\MySql\libmysql.dll'
      end
      object ZQuery1: TZQuery
        Connection = ZConnection1
        Active = True
        SQL.Strings = (
          'select * from matable1')
        Params = <>
      end
      object DataSource1: TDataSource
        DataSet = ZQuery1
      end
      object DBGrid1: TDBGrid
        DataSource = DataSource1
      end
      object DBNavigator1: TDBNavigator
        DataSource = DataSource1
      end

还要确保 dgRowSelect 为假。 Editing 和 RowSelect 是互斥的(不能同时为真)。