Bearbeiten und Aktualisieren Sie die Werte in dbgrid in delphi
Ich bin neu in delphi und erstelle ich eine Datenbank für Kunden und ich bin in der Lage, füllen Sie Ihre details in einem dbgrid durch Viewcustomers-Taste. Aber ich bin versucht, zu aktualisieren, Ihre details durch: das auswählen einer Zeile und ändern Sie einen Wert in eine Zelle und Aktualisierung derselben durch klicken der Schaltfläche "Bearbeiten".
Ich bin in der Lage, das gleiche zu tun, indem Sie die Zeile markieren und fething die Daten in einer separaten form. Aber ich möchte zu tun, ändern Sie die Werte in dbgrid selbst und aktualisieren. Kann mir da jemand helfen? Aktualisiert mit TDB-navigator und dgEnabled Eigenschaft.
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) Nur die überprüfung der Arbeit der TDBedit in der Datenbank demos, die es funktioniert, aber ich habe ein neues Projekt erstellt mit backend-Datenbank immer noch ist es mir nicht erlaubt, zu Bearbeiten.
Sorry, die Antwort zu b) kann nicht sein "TDataSource". Ein TDataSource ist lediglich ein Vermittler zwischen der Komponente, die tatsächlich abgerufen und hält die db-Daten, die eine spezifische Nachkomme von TDataSet, wie TSqlQuery wenn Sie DBExpress, oder TAdoQuery wenn Sie ADO verwenden. Welche Art ist das DataSet verbunden customersDataGrid.DataSource? Es ist wichtig zu wissen, dass ...
Btw, der code, den Sie Hinzugefügt, "wenn customersDataGrid.Felder[i].FieldName='customerId' dann, wenn customersDataGrid.Felder[i].FieldName='customerName'" kann möglicherweise nicht arbeiten, denn wenn die Bedingung in der ersten "wenn ..." ist wahr, d.h., dass das Feld name ist 'customerid', es kann nicht passieren das zweite "wenn .." - test, da die gleiche Feld name nicht 'customerName'.
Was ist das dataset, die Sie verwenden zu bieten, Datensätze zu TDBGrid?
InformationsquelleAutor delsql | 2015-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte, ich würde post dies als eine neue Antwort, denn es ist deutlich geworden, dass bin ich nicht
die Beantwortung der gleichen Frage, als ich dachte, ich war. Unten sind Auszüge aus
zwei D7-Projekte, die in-place-Bearbeitung einer MySql-Tabelle die
hat eine ID-Spalte und zwei 80-Zeichen-wide-string-Spalten. Beide sind getestet
und gut funktionieren.
Die Auszüge sind tatsächlich aus den DFM-Dateien der Projekte und zeigen, welche
Komponenten, die Sie benötigen, wie Sie zu verbinden, und welche Eigenschaften Sie benötigen
legen Sie in der
Object Inspector
(die standardmäßig die IDE gibt, um Komponenten gelöschtauf dem Formular von der
Component Palette
sind ok für den rest.Gibt es keinen code hinzufügen, um diese Projekte entweder: Alles, was Sie tun müssen, ist, um die
Active
- Eigenschaft des dataset, die mitDataSource1
zuTrue
, d.h.CDS1
für das DBExpress-ein-undZQuery1
für die Zeos.Offensichtlich, Sie würden anpassen müssen, um den Datenbank-Namen, Feld-Namen, Benutzernamen und
Passwort zu Ihrer Datenbank.
DFMs
Verwenden von DBExpress-Komponenten (die kommen mit D7)
Mit ZEOS-Komponenten (verfügbar ab SourecForge.Net)
Froh, dass Sie die Lösung gefunden. Als ich gegangen bin, um die Mühe des Schreibens zwei Antworten, ich denke, ich werde Rollen Sie in ein und fügen Sie die "RequestLive" der Punkt ist; auf diese Weise kann es helfen, die künftigen Leser, zu lösen versucht ein ähnliches problem.
InformationsquelleAutor MartynA
Ja, das ist möglich.
Ist es am besten fügen Sie einen TDBNavigator auf Ihrem Formular, und legen Sie die DataSource, um die gleiche wie die Gitter. Der Punkt dabei ist, dass es gibt Ihnen eine einfache Weise zu speichern, oder auf Abbrechen, änderungen, da die Tasten für diese Vorgänge.
Sollten Sie feststellen, dass, wenn Sie klicken Sie doppelt in eine Zelle im raster, und die erste klicken Sie konzentriert es, und die zweite legt man in den Bearbeiten-Modus. Sie können dann Bearbeiten Sie die Zelle Wert. Wenn Sie vermeiden möchten, klicken Sie die Zelle doppelt, legen Sie
dgAlwaysShowEditor
zuTrue
.Btw, zum aktivieren von in-place-Bearbeitung in der grid, der Wert
dgEditing
(unter dem rasterOptions
Eigenschaft in derObject Inspector
) mussTrue
unddgRowSelect
werden mussFalse
wie das rasterReadOnly
Eigenschaft.Wenn Sie feststellen, dass Sie nicht Bearbeiten können Sie eine Spalte Wert, dass Sie denken, Sie sollte bearbeitet werden, versuchen Sie Folgendes:
Wenn du hast persistente TFields für das dataset, überprüfen Sie die TField für die Spalte in der
Object Inspector
um sicherzustellen, dass die Feld ist nicht schreibgeschützt markiert.Überprüfen Sie, dass die dtataset nicht eine nur-lese-Eigenschaft, die auf True gesetzt wird.
Setzen Sie ein TDBedit auf das Formular, und schließen Sie es an eine der dataset - fileds. Wird akzeptieren, dass ein edit.
Wenn keines dieser Dinge funktionieren, Sie müssen nur, um einige zu Debuggen. Untersuchen Sie das raster, Felder und Datensätze nur-lese-Eigenschaften zur Laufzeit verwenden Sie den debugger, um sicherzustellen, dass keines von Ihnen ist Wahr. ODER starten Sie ein neues Projekt, das nur aus einer form, die ein dataset, dataset, dbgrid und dbnavigator, die mit den Eigenschaften einstellen wie ich beschrieben habe: Nun, können Sie in-place-edit?
Als eine alternative zur Verwendung des DBNavigator -
Save
undCancel
Tasten, können Sie einfach anrufenDataSet.Post
undDataSet.Cancel
.In diesem Fall werden die Gitter wahrscheinlich denkt, dass der Datensatz schreibgeschützt ist für somereason. Überprüfen Sie Ihre Komponente von Einstellungen, insbesondere der grid ReadOnly-Eigenschaft.
Ich habe gerade überprüft Komponente Einstellungen, Datagrid-Readonly-Eigenschaft= false.
Trotzdem stecken? Haben Sie versuchen, erstellen ein neues Projekt, wie ich vermutete?
Ich habe Readonly-Eigenschaft= false überall in meinem bestehenden Projekt ist, und ich auch versucht haben, erstellen Sie ein neues Projekt erstellen neues Formular,dataset,dbgrid,dbnavigator und TDBedit-Steuerelemente. Auch, dass ich nicht in der Lage bin, zu Bearbeiten, die für einige Grund.
InformationsquelleAutor MartynA
Stellen Sie außerdem sicher dgRowSelect ist falsch. Bearbeitung und RowSelect sich gegenseitig ausschließen (können nicht beide zur gleichen Zeit auf true).
InformationsquelleAutor Bruce