나는 이것을했는데 꽤 못생긴다! 바운드 열이있는 모눈 뷰를 만들고 필드 형식이 부울 인 언 바운드 확인란 열을 추가합니다.
기본적으로 격자보기의 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을에서 스페이스 바를 눌러 확인하여 확장을 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;
나는 그게 생각합니다. 나는 우리가 잠시 동안 구축 한 대형 그리드/뷰 도우미 유닛에서 그것을 파 냈습니다. 아, 그리고 현재 DXVCL v2011 vol 1.10과 함께 Delphi 2010에서 작업 중입니다.
희망이 있습니다.
귀하의 궁금한 점은 무엇입니까? 언 바운드 열을 추가하는 방법입니까? 또는 "그리드 루프"하는 방법? 아니면 완전히 다른 것? 당신은 여기서 전혀 질문하지 않습니다. 방금 여러 문장을 게시했습니다. 또한, [DevExpress GridControl Unbound Columns] (http://stackoverflow.com/q/6432940/62576)를 보았습니까? –