我是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的工作是否有效,但我创建了一个没有任何后端数据库的新项目,但它仍然不允许我进行编辑。
答案 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 Inspector
和Save
按钮的替代方法,您只需拨打Cancel
和DataSet.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)。