2013-01-17 2 views
2

일부 항목을 선택할 수 있도록 언 바운드 확인란을 추가하려는 DevExpress 그리드가 있습니다. 선택이 완료된 후 버튼을 누르면 선택한 모든 항목을 가져 오기 위해 격자를 반복해야합니다. 확인란이어야합니다. 멀티 그리드 그리드를 사용해 보았지만 사용자들이 그걸로 작업 할 수는 없습니다.언 바운드 열이있는 표식 그리드

나는 supportsites에서 찾을 수 있었던 모든 샘플을 시도했지만 운이 없다.

  • 다중 사용자 설정이고 사용자가 서로 선택 취소했기 때문에 언 바운드 방식이 필요합니다.

내 질문 : 어떻게 수행 할 수 있는지 보여주는 샘플이 있습니까?

+4

귀하의 궁금한 점은 무엇입니까? 언 바운드 열을 추가하는 방법입니까? 또는 "그리드 루프"하는 방법? 아니면 완전히 다른 것? 당신은 여기서 전혀 질문하지 않습니다. 방금 여러 문장을 게시했습니다. 또한, [DevExpress GridControl Unbound Columns] (http://stackoverflow.com/q/6432940/62576)를 보았습니까? –

답변

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을에서 스페이스 바를 눌러 확인하여 확장을 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에서 작업 중입니다.

희망이 있습니다.

+0

나는 실제로 덴마크에있는 내 친구 중 한 명이 만든 샘플 앱을 가지고있다. 관심이 있으시면 내가 물어볼 수 있는지 물어 보겠습니다. 매우 쉽고 빠르게 사용할 수 있습니다. – OZ8HP

+0

제안 해 주셔서 감사합니다. 그러나 나는 그 프로젝트를 지금 당장 뒤에 남길 수 있기를 바라고 있습니다. – shunty