2017-10-19 48 views
1

我從表中讀取一些數據並將數據複製到cxGrid中的一列,然後我想直接將其更新到數據庫。 這有可能嗎?Delphi,cxGrid設置列值並更新數據庫

我一直在使用setEditValue嘗試,但一個需要類型的參數:

TcxDataEditValueSource = (evsValue, evsText, evsKey); 

我能」找到這種類型。 在DeveloperExpress的一些例子中,他們將其設置爲1,但這不起作用。這是錯誤的類型說是編譯器。

這是我用來使數據進入網格的代碼,但是我可以讓它更新數據集嗎?

var 
    RecIDx, 
    ColIdx, 
    sorNo, 
    RecID, 
    i: integer; 
    AB, 
    AT: double; 

begin 
    try 
    // Get marked row and column 
    RecIDx := grGeneralInfoMallDBTableView1.Controller.SelectedRecords[0] 
     .RecordIndex; 
    ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
     ('ID').Index; 

    // Get SortingOrderNo 
    sorNo := grGeneralInfoMallDBTableView1.DataController.Values 
     [RecIDx, ColIdx]; 

    // Get AB and AT from SortingOrderRow with highest priority (lowest number) 
    dmsSortOrder.sq_Get_AB_AT.Active := false; 
    dmsSortOrder.sq_Get_AB_AT.ParamByName('sorNo').AsInteger := sorNo; 
    dmsSortOrder.sq_Get_AB_AT.Active := true; 
    dmsSortOrder.sq_Get_AB_AT.First; 
    if dmsSortOrder.sq_Get_AB_AT.EOF then 
    begin 
     showMessage('ERROR! Could not find record for sortorder: ' + 
     intToStr(sorNo)); 
     exit; 
    end; 
    // Copy AT and BT to the grid. 
AT := dmsSortOrder.sq_Get_AB_AT.FieldByName('AT').AsFloat; 
AB := dmsSortOrder.sq_Get_AB_AT.FieldByName('AB').AsFloat; 


// Set the cell value 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Edit; 
ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
    ('AT').Index; 
grGeneralInfoMallDBTableView1.DataController.SetValue(RecIDx,ColIdx, AT); 
ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
    ('AB').Index; 
grGeneralInfoMallDBTableView1.DataController.SetValue(RecIDx,ColIdx, AB); 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Post; 
    finally 
    end; 

end; 
+2

如果你的GridView的數據綁定,你應該能夠簡單地更新基礎'TDataSet'領域。 – nil

+0

你真叫醒我!我改變了上面的代碼以顯示我是如何做到的。簡單,我不需要以這種方式將數據添加到網格。謝謝! – larand

+1

您的歡迎。順便說一句,你現在改變了你的問題,不再是問題。將這個改變回復到這個問題會更好。發表你自己的答案與你如何解決它是絕對好的。 – nil

回答

1

這是我如何解決它:

var 
    RecIDx, 
    ColIdx, 
    sorNo, 
    RecID, 
    i: integer; 
    AB, 
    AT: double; 

begin 
    try 
    // Get marked row and column 
    RecIDx := grGeneralInfoMallDBTableView1.Controller.SelectedRecords[0] 
     .RecordIndex; 
    ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
     ('ID').Index; 

// Get SortingOrderNo 
sorNo := grGeneralInfoMallDBTableView1.DataController.Values 
    [RecIDx, ColIdx]; 

// Get AB and AT from SortingOrderRow with highest priority (lowest number) 
dmsSortOrder.sq_Get_AB_AT.Active := false; 
dmsSortOrder.sq_Get_AB_AT.ParamByName('sorNo').AsInteger := sorNo; 
dmsSortOrder.sq_Get_AB_AT.Active := true; 
dmsSortOrder.sq_Get_AB_AT.First; 
if dmsSortOrder.sq_Get_AB_AT.EOF then 
begin 
    showMessage('ERROR! Could not find record for sortorder: ' + 
    intToStr(sorNo)); 
    exit; 
end; 
// Copy AT and BT to the grid. 
AT := dmsSortOrder.sq_Get_AB_AT.FieldByName('AT').AsFloat; 
AB := dmsSortOrder.sq_Get_AB_AT.FieldByName('AB').AsFloat; 

grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Edit; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.FieldByName('AT').Value := AT; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.FieldByName('AB').Value := AB; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Post; 
    finally 
    end; 

end; 
相關問題