在 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
属性 下)需要 True
和 dgRowSelect
需要 False
,网格的 ReadOnly
属性.
也是如此
如果您发现无法编辑您认为应该可编辑的列值,请尝试以下操作:
如果您为数据集设置了持久性 TField,请检查 Object Inspector
中该列的 TField 以确保该字段未标记为只读。
检查数据集没有设置为 True 的只读 属性。
在表单上放置一个 TDBedit 并将其连接到数据集的一个字段。那会接受编辑吗。
如果其中 none 有效,您只需要进行一些调试。使用调试器在 运行 时检查网格、字段和数据集的只读属性,以确保其中 none 为 True。或者开始一个新项目,该项目仅包含一个表单、一个数据集、数据集、dbgrid 和一个 dbnavigator,其属性设置如我所描述的:现在,您可以在其中进行就地编辑吗?
作为使用 DBNavigator 的 Save
和 Cancel
按钮的替代方法,您可以简单地调用 DataSet.Post
和 DataSet.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 是互斥的(不能同时为真)。
我是 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
属性 下)需要 True
和 dgRowSelect
需要 False
,网格的 ReadOnly
属性.
如果您发现无法编辑您认为应该可编辑的列值,请尝试以下操作:
如果您为数据集设置了持久性 TField,请检查
Object Inspector
中该列的 TField 以确保该字段未标记为只读。检查数据集没有设置为 True 的只读 属性。
在表单上放置一个 TDBedit 并将其连接到数据集的一个字段。那会接受编辑吗。
如果其中 none 有效,您只需要进行一些调试。使用调试器在 运行 时检查网格、字段和数据集的只读属性,以确保其中 none 为 True。或者开始一个新项目,该项目仅包含一个表单、一个数据集、数据集、dbgrid 和一个 dbnavigator,其属性设置如我所描述的:现在,您可以在其中进行就地编辑吗?
作为使用 DBNavigator 的 Save
和 Cancel
按钮的替代方法,您可以简单地调用 DataSet.Post
和 DataSet.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 是互斥的(不能同时为真)。