Spread for .NET

필터한 컬럼의 값을 가져오기

하_늘_바_람 2022. 5. 30. 18:12

AutoFilterColumn 이벤트에서 컬럼에서 어떤 값으로 필터를 했는지 알고 싶을 때
아래의 형태로 추출한다.

전체 이벤트 코드

private void sprPurchaseDetail_AutoFilteredColumn(object sender, AutoFilteredColumnEventArgs e) {
    // 합계 값 재계산
    // 최종 필터 값
    string lastFilterString = string.Empty;
    // 내부 필터 값
    string innerFilterString = string.Empty;

    // 필터를 설정한 컬럼 가져오기
    foreach (FilterColumnDefinition columnDef in e.Sheet.RowFilter.ColumnDefinitions) {
        // 컬럼명
        string columnName = dtPurchaseDetail.Columns[columnDef.ColumnIndex].ColumnName;

        // 필터를 설정한 컬럼에서 필터 정보 추출하기
        foreach (var item in columnDef.Filters) {
            // 기본(다중 필터가 아닌)인 경우는 다음으로 넘어가기
            if (item is null || item is FarPoint.Win.Spread.DefaultFilterItem)
                continue;

            // 필터 해제를 할 때 해당 열의 인덱스와 All이라는 문자열을 반환한다.
            // 이 경우 기존의 필터에 설정된 값을 삭제 처리 함.
            // 왜 자동으로 삭제가 안되는지를 모르겠음.
            if (columnDef.ColumnIndex == e.Column && e.FilterString.Contains("All")) {
                (item as MultiValuesFilterItem).FilterItems.Clear();
                continue;
            }

            // 필터용 문자열 만들기
            // 내부 필터는 OR로 연결
            foreach (FilterItemValue itemValue in (item as MultiValuesFilterItem).FilterItems) {
                innerFilterString += $" OR {columnName} = '{itemValue.Value}'";
            }
        }

        // 최종 필너는 OR로 연결된 내부 필터를 AND로 연결함.
        if (innerFilterString.Length > 0) {
            lastFilterString += " AND (" + innerFilterString.Substring(4) + ")";
            innerFilterString = string.Empty;
        }
    }

    // 계산 로직을 실행하는 부분
    CalcSpreadTotalSum(lastFilterString.Length >= 5 ? lastFilterString.Substring(5) : "");
}