0

我遇到了 DevExpress VCL 网格的问题,抛出“RecordIndex out of range”错误,尽管在那种情况下没有直接调用网格的任何记录函数。

我正在做的事情相当简单:一旦更改记录(AfterScroll),就会调用一个方法。在这个方法中,我调用了另一个方法,它根据新记录中的字段分配数据源和数据字段名称。

代码非常简单,如下所示:

procedure TValidatedOrders.UpdateDispenseNotes;
var Dataset : TDataSet;
    GroupTypeFieldName : String;
    DataSource : TDataSource;
    DataFieldName : String;
    GroupType : Integer;

    procedure SetSpecsDataSource;
    begin
         DataSource := DMValidatedDispense.DSDispenseGroupSpecs;
         DataFieldName := 'GLAZING_INSTRUCTIONS';
    end;

    procedure SetCLsDataSource;
    begin
         DataSource := DMValidatedDispense.DSDispenseGroupCLs;
         DataFieldName := 'WEAR_INSTRUCTIONS';
    end;
begin
     // Step 1: Get the group type
     If GetTopPage = cTopPageOrders Then
        Dataset := DMValidatedDispense.CDSLabOrders
     Else
        Dataset := DMValidatedDispense.CDSLabDispenses;

     GroupType := Dataset.FieldByName( 'GROUP_TYPE' ).AsInteger;
     // Step 2: Assign the MemoDispenseNotes data binding appropriately
     If GetTopPage = cTopPageOrders Then
     Begin
         case GroupType of
         cOrderGroupSpecs, cOrderGroupFrame,
         cOrderGroupLens, cOrderGroupGlazing: SetSpecsDataSource;
         cOrderGroupCLs: SetCLsDataSource;
         else SetSpecsDataSource;
         end;
     End
     Else
     Begin
          case GroupType of
          cDispenseGroupSpecs: SetSpecsDataSource;
          cDispenseGroupCLs: SetCLsDataSource;
          else SetSpecsDataSource;
          end;
     End;
     MemoDispenseNotes.DataBinding.DataSource := DataSource;
     MemoDispenseNotes.DataBinding.DataField := DataFieldName;     
end;

调用上述方法的原始代码太长,无法在此处报告,无论如何它包含面板显示/隐藏,类型检查 .FieldByName( 'GROUP_TYPE' ).AsInteger = SomeValue 等内容:没有定位,没有 FindKey 或类似的东西。

正如我所说,没有直接涉及记录选择(虽然不确定 DevExpress 网格内部发生了什么......)而且我不明白为什么我会收到这样的错误。

有人对可能发生的事情有一个绝妙的主意吗?

非常感谢!

4

1 回答 1

0

AFAICS 此方法仅更改组件DataSource的。TcxDBMemo罪魁祸首肯定在别处,而且很可能是某些人event

作为调试它的第一步,我会尝试在代码的开头和结尾使用BeginUpdate和查看您的网格。EndUpdate

于 2013-11-29T08:12:18.670 回答