2

一部のアイテムを選択できるように、バインドされていないチェックボックスを追加したい DevExpress グリッドがあります。選択が完了したら、ボタンを押します。グリッドをループして、選択したすべてのアイテムを取得する必要があります。チェックボックスでなければなりません。複数選択可能なグリッドを試してみましたが、ユーザーはそれを操作できません。

サポート サイトで見つけたすべてのサンプルを試しましたが、うまくいきませんでした。

  • マルチユーザーのセットアップであり、ユーザーが互いに選択および選択解除しているため、バインドされていないアプローチが必要です。

私の質問:これを行う方法を示す実際のサンプルを持っている人はいますか?

4

1 に答える 1

1

私はこれをやったが、それは(である!)かなり醜い!バインドされた列でグリッド ビューを作成し、フィールド タイプがブール値のバインドされていないチェックボックス列を追加します。

基本的にグリッドビューのOnCellClickを扱います。クリックされたアイテムがチェックボックス列であるかどうかを確認します-チェックボックスタイプのビューで最初のバインドされていない列を見つけることによって。次に、その状態を切り替えます。

データセットの AutoEdit を true に設定しましたが、削除/編集/挿入を false に設定し、ImmediateEditor を false に設定しました。それらのどれが重要か正確にはわかりません。

最も困難だったのは、グリッドとビュー レベル オブジェクトの複雑な階層を理解し、どのレベルに必要なビットが含まれているかを判断することだったと思います。もっと良い方法があると確信していますが、今の方法でうまくいきました。二度と触れません!

これは私のコードから持ち上げられていますが、わずかに変更されており、そのままではテストされていません。また、もう少しエラーチェックが必要です。

procedure TMyForm.ViewCellClick(Sender: TcxCustomGridTableView;
  ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
  AShift: TShiftState; var AHandled: Boolean);
var
  col: TcxGridColumn;
begin
  // Manually handle the clicking of the checkbox cell - otherwise it seems
  // virtually impossible to get the checked count correct.
  col := GetViewCheckColumn(Sender);
  if (Sender.Controller.FocusedItem = col) then
  begin
    ToggleRowSelection(TcxCustomGridTableView(TcxGridSite(Sender).GridView), col);
  end;
end;

procedure TMyForm.ToggleRowSelection(AView: TcxCustomGridTableView; ACol: TcxGridColumn);
var
  rec: TcxCustomGridRecord;
begin
  rec := AView.Controller.FocusedRecord;
  if (rec = nil) then exit;

  if (rec.Values[ACol.Index] = TcxCheckBoxProperties(ACol.Properties).ValueChecked) then
  begin
    rec.Values[ACol.Index] := TcxCheckBoxProperties(ACol.Properties).ValueUnchecked;
  end
  else
  begin
    rec.Values[ACol.Index] := TcxCheckBoxProperties(ACol.Properties).ValueChecked;
  end;
end;


function TMyForm.GetViewCheckColumn(AView: TcxCustomGridView): TcxGridColumn;
var
  index: integer;
  vw: TcxCustomGridTableView;
  item: TcxCustomGridTableItem;
begin
  // We're looking for an unbound check box column - we'll return the first
  // one found.

  Assert(AView <> nil);
  result := nil;
  if (AView is TcxCustomGridTableView) then
  begin
    vw := TcxCustomGridTableView(AView);
    for index := 0 to vw.ItemCount - 1 do
    begin
      item := vw.Items[index];
      if (item.Properties is TcxCustomCheckBoxProperties) then
      begin
        if (item is TcxGridDBColumn) then
        begin
          if (TcxGridDBColumn(item).DataBinding.FieldName = '') then
          begin
            result := TcxGridColumn(item);
            break;
          end;
        end;
      end;
    end;
  end;
end;

次に、グリッドの OnKeyUp で SPACE バーが押されているかどうかを確認し、ToggleRowSelection を呼び出して行をダブルクリックすることで拡張しました。

行を反復処理するとき、次のようなものを使用して行がチェックされているかどうかをテストできます。

function TMyForm.GetViewIsRowChecked(AView: TcxCustomGridView; ARecord: TcxCustomGridRecord): boolean;
var
  col: TcxGridColumn;
begin
  result := False;
  col := GetViewCheckColumn(AView);
  if ((col <> nil) and (ARecord <> nil)) then
  begin
    result := (ARecord.Values[col.Index] = TcxCheckBoxProperties(col.Properties).ValueChecked);
  end;
end;

それだけだと思います。しばらくかけて構築した大きなグリッド/ビュー ヘルパー ユニットから掘り出しました。ああ、現在、Delphi 2010 と DXVCL v2011 vol 1.10 で動作しています。

それが役に立てば幸い。

于 2013-01-18T11:10:47.843 に答える