0

cxgridのレコードをループしてフィールド/列を更新するための回答の助けを借りて作成された cxGrid を更新する機能があります。

しかし、それは時々少し奇妙な行動をしています。cxGrid でフォームを開き、他に何もせずに列ヘッダーをクリックすると、レコードは正常に更新されます。しかし、'selectorbar' を上から移動すると、マークされたレコードは更新されません。変更が必要なプロパティだと確信していますが、どのプロパティですか。

変数 fSelected は FormShow で False に設定されており、ユーザーがレコードを選択解除できるようになっています。

procedure TfrmContactsSelect.colContactSelectedHeaderClick(Sender: TObject);
var
  i: Integer;
  Index: Integer;
  BookMark : TBookMark;
  Contact: variant;
begin
  if fMulti = True then
    begin
     Screen.Cursor := crHourGlass;
     fSelected := not fSelected;
      BookMark := qryContacts.GetBookmark;
      qryContacts.DisableControls;
      try
        for i := 0 to grdContactsView1.DataController.FilteredRecordCount - 1 do
          begin
            Index := grdContactsView1.DataController.FilteredRecordIndex[i];
            Contact := grdContactsView1.DataController.Values[Index, 4];
            if grdContactsView1.DataController.LocateByKey(Contact) then
              begin
                qryContacts.Edit;
                qryContacts.FieldByName('fldcontact_selected').AsBoolean := fSelected;
                qryContacts.Post;
              end;
          end;
      finally
        qryContacts.EnableControls;
        qryContacts.GotoBookmark(BookMark);
        qryContacts.FreeBookmark(BookMark);
      end;
      Screen.Cursor := crDefault;
    end;
end;

Delphi XE7、DevExpress 14.2.2、DB アクセス用の UniDAC 5.5.12

コメント:MartynAからの回答と入力に基づいて、次のソリューションになりました

procedure TfrmContactsSelect.colContactSelectedHeaderClick(Sender: TObject);
var
  i: Integer;
  Index: Integer;
  MarkedRecord: variant;
  CurrentRecord: variant;
begin
  if fMulti = True then
    begin
      Screen.Cursor := crHourGlass;
      fSelected := not fSelected;

      Index := grdContactsView1.DataController.FocusedRecordIndex;
      MarkedRecord := grdContactsView1.DataController.Values[Index, colContactGuid.ID];

      try
        for i := 0 to grdContactsView1.DataController.FilteredRecordCount - 1 do
          begin
            Index := grdContactsView1.DataController.FilteredRecordIndex[i];
            CurrentRecord := grdContactsView1.DataController.Values[Index, colContactGuid.ID];
            if grdContactsView1.DataController.LocateByKey(CurrentRecord) then
              begin
                grdContactsView1.DataController.Edit;
                grdContactsView1.DataController.SetEditValue(colContactSelected.ID, fSelected, evsText);
                grdContactsView1.DataController.Post;
              end;
          end;
      finally
        grdContactsView1.DataController.LocateByKey(MarkedRecord);
      end;

      Screen.Cursor := crDefault;
    end;
end;
4

1 に答える 1