FooterSummary 에 checkBox에 체크된 넘만 실시간으로 Footer에 표시하시고싶다면 어떻게 할까요?
우선 CxDBGrid 를 더블 클릭하고 나온 그리드 박스에서 SUmmary를 선택하고 Footer에 Add를 클릭하여 Footer를 추가합니다.
추가된 내용을 눌러 property를 설정하고 Kind를 skCount로 설정합니다.
그럼, 모든 Chkbox의 내용을 Count해서 출력합니다. Check가 되 있던 안되있던 모두 카운트 합니다.
이게 정상이죠.
그런데 , 우리는 Chkbox의 Checked된 내용만 Count 하려 하는 것이므로 아래 처럼 다시 이벤트를 이용해 구성합니다.
cxGrid의 TableView 이벤트에서 Summary->FooterSummaryItems->OnSummary 에 아래 처럼 코딩을 합니다.
1 2 3 4 5 |
if ASender.DataController.GetValue(Arguments.RecordIndex , 체크컬럼.Index) = False then begin OutArguments.CountValue:=OutArguments.CountValue-1; //만일 체크박스가 False 이면 Count를 하나 감소한다.(summry kind 가 count 일때) OutArguments.Value:=0; //만일 체크박스가 False 이면 Value값을 0으로 돌린다.(summry kind 가 sum 과 같은경우) end; |
그럼.. 실행해보시면 아시겠지만 , Checked된 넘의 갯수만 가져옵니다.
하지만, 여기 서 문제가 나옵니다.
실행시간에 Checked를 하고 나면 안바뀌고 Record를 이동하거나 저장을 누르면 Checked된 내용에 따라 다시 계산을 해줍니다.
왜 그럴까요? 간단합니다.
사용자가 Check를 하면 이것이 cxGRid의 MEM Table 또는 DBTable에 저장이 되지 않았으니깐 바로 적용이 안되는 것입니다. 어차피 cxGrid도 어딘가에 저장된 내용을 가지고 Checked를 하니까요….
그럼. 사용자가 CheckBox를 누를때마다 저장해봅시다.
CxGrid(퀀텀그리드)에는 많은 이벤트가 있지만, 이중 저는 OnEditValueChanged를 자주 사용합니다.
여기에 아래처럼 코딩을 합니다.
1 2 3 4 5 6 7 8 9 |
Var DS : TDataSet; begin If AItem.Caption<>'Caption명' Then exit; DS := TcxGridDBTableView( Sender ).DataController.DataSet; TcxGridDBTableView( Sender ).DataController.UpdateData; if DS.Modified then DS.Post; |
UpdateData는 반드시 적어야 합니다.
UpdataData는 실제 수정된 데이타를 메모리 상에 저장을 시키고, DataSet에 이를 알리는 역활을 합니다.
자 이제 다시 실행을 해봅니다.
그럼.. CheckBox를 누를때마다 OnEditValueChanged이벤트를 잘타고 잘 진행 합니다.
숫자도 잘 바뀝니다.
참고 하시기 바랍니다.
최신 댓글