在delphi

时间:2015-09-21 14:31:45

标签: delphi delphi-7

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

我可以通过选择行并以单独的形式显示数据来做同样的事情。但我想改变dbgrid本身的值并更新。有人可以帮忙吗?更新了TDB navigator和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的工作是否有效,但我创建了一个没有任何后端数据库的新项目,但它仍然不允许我进行编辑。

3 个答案:

答案 0 :(得分:1)

是的,这是可能的。

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

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

顺便说一句,要在网格中启用就地编辑,值dgEditing(在Options中的网格Object Inspector属性下)必须为{{1 }和True需要dgRowSelect,网格的False属性也是如此。

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

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

  • 检查dtataset是否没有设置为True的只读属性。

  • 在表单上放置一个TDBedit并将其连接到其中一个数据集的文件。是否接受编辑。

  • 如果这些都不起作用,您只需进行一些调试即可。检查网格,字段'和数据集在运行时使用调试器的只读属性,以确保它们都不是True。或者启动一个新项目,该项目只包含一个表单,一个数据集,数据集,dbgrid和一个dbnavigator,其属性设置为我所描述的:现在,你可以在那里进行编辑吗?

作为使用DBNavigator的Object InspectorSave按钮的替代方法,您只需拨打CancelDataSet.Post

答案 1 :(得分:1)

我以为我会把它作为一个新答案发布,因为很明显我不是 回答我认为的同样的问题。以下是摘录 两个D7项目,提供MySql表的就地编辑 有一个ID列和两个80个字符的字符串列。两者都经过测试 工作正常。

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

没有代码需要添加到这些项目中的任何一个:您需要做的就是将连接到Active的数据集的DataSource1属性设置为True,即{1}用于DBExpress,CDS1用于Zeos one。

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

<强>的DFM

使用DBExpress组件(随D7一起提供)

ZQuery1

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

      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

答案 2 :(得分:-2)

还要确保dgRowSelect为false。编辑和RowSelect是互斥的(不能同时为true)。