DevExpress에서는 열별 Summary를 GroupFooter를 통해 자동 생성을 지원하고 있습니다.

GroupField와 xrTableCell별 DataBinding을 이용하면 쉽게 소계와 합계를 낼 수 있습니다.

 

다만 다음과 같은 상황을 생각해봅시다.

 

[QUNT] [COST] [TLAM]

 

수량[QUNT]과 단가[COST]를 곱해서 결과[TLAM]를 내야 하는데, Detail이나 GroupFooter인 경우, xrTableCell을 기준으로 접근할 수가 없습니다.

왜냐하면, Detail과 GroupFooter는 테이블의 상태에 따라 자동으로 갯수가 변화하게 되는데, 객체 자체는 하나로 계속 유지되기 때문입니다.

그런고로 Event를 잡아서 xrTableCell.Text를 꺼내봐도 아무것도 없으며, String을 넣는다 하더라도 Report에 반영되지 않습니다.

 

먼저는 자동 생성하는 셀 객체를 찾아야 합니다. 그러기 위해서는 먼저 찾고자 하는 셀의 'BeforePrint' Event 메소드를 생성합니다. (속성에서 생성가능)

생성하고 나면 매개변수는 다음과 같습니다.

 

private void xrTableCell_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)

 

sender 오브젝트를 XRTableCell으로 캐스팅하면 라인이 추가로 생성될 때마다 생성되는 Cell을 가져올 수 있습니다.

그래서 예를 들어 다음과 같이 하면 생성될 때마다 Cell에 값을 찍을 수 있습니다.

 

XRTableCell cell = (XRTableCell) sender;

cell.Text = "SomeThing";

 

특정한 값을 가져오기 위해서는 조금 복잡합니다. cell의 Text값은 Print 되기 전에는 빈 값입니다.

그리고 XRTableCell의 내부 변수에는 Value 값이 없습니다. Report에서 보이는 단일 사각형과 관련된 정보(디자인적 요소)만 있다고 생각하시면 됩니다.

그리하여 다음과 같이 돌아가야 특정한 값을 가져올 수 있습니다.

 

XRTableCell cell = (XRTableCell) sender;

XtraReport report = cell.RootReport;

object Value = report.GetCurrentColumnValue("QUNT");

 

위와 같은 상황에서 저 행이 Detail이라면 다음과 같이 매 번 Detail이 생성될 때마다 거기에 현재 찍힐 수량[QUNT] 값을 가져올 수 있습니다.

다만 이의 경우 Summary 등으로 구성된 이름 없는 변수값을 가져올 수가 없습니다.

 

GroupFooter에서 자동으로 Summary된 값을 가져오려면 다음과 같이, cell에 넣어놓은 Summary 메소드를 실행하면 됩니다.

 

XRTableCell cell = (XRTableCell) sender;

object value = cell.Summary.GetResult();

 

다만 이렇게 코딩할 경우, Summary는 구성되어 있지만 값이 없어서 GetResult 결과가 null로 나올 경우, NullPointException 에러가 Print 창에서 발생합니다. 

"개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라고 하며, Debug에서도 잡히지 않습니다.

그런고로 저는 다음과 같이 처리하였습니다.

 

XRTableCell cell = (XRTableCell) sender;

if (cell.Summary.GetResult() == null)

return "SomeErrorThing";

else

return cell.Summary.GetResult();

 

이렇게 구성하시면, 전역변수를 통해 메소드간 데이터를 주고 받고, 행간 수식을 구성하실 수 있습니다.

 

P.S. Summary를 사용하지 않는 행의 경우, RootReport를 통해 아예 현재의 Row을 가져오는 방법도 있습니다. (GroupFooter이기 때문에 이렇게 복잡합니다.)

다음과 같이 짜면, Row를 바로 가져와 내부 행들을 쓸 수 있습니다. (Detail의 경우)

 

XRTableCell cell = (XRTableCell) sender;

XtraReport report = cell.RootReport;

DataRowView currentRow = (DataRowView) report.GetCurrentRow();

object[] rowItem = currentRow.Row.ItemArray;

 

//cell.text = (decimal) rowItem[1] * (decimal) rowItem[2]

+ Recent posts