【问题标题】:Delphi, cxGrid setting a column value and update the databaseDelphi、cxGrid设置列值并更新数据库
【发布时间】:2017-10-19 09:09:25
【问题描述】:

我从表中读取一些数据并将数据复制到 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;

【问题讨论】:

  • 如果您的 GridView 是数据绑定的,您应该能够简单地更新底层 TDataSet 的字段。
  • 你真的把我吵醒了!我更改了上面的代码以显示我是如何做到的。很简单,我不需要以这种方式将数据添加到网格中。谢谢!
  • 欢迎您。顺便说一句,你现在把你的问题改成了没有问题了。最好将此更改还原为问题。发布您自己的答案以及您如何解决它是绝对可以的。
  • 你应该按照@nil 所说的去做。

标签: delphi tcxgrid


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多