私はこれをやったが、それは(である!)かなり醜い!バインドされた列でグリッド ビューを作成し、フィールド タイプがブール値のバインドされていないチェックボックス列を追加します。
基本的にグリッドビューの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 で動作しています。
それが役に立てば幸い。