■ FilterCriteria, FilterString
그리드에 필터를 적용하려면 DataControlBase.FilterCriteria 속성 또는 DataControlBase.FilterString 속성을 사용하면 된다.
이 두 속성은 그리드의 열에 각각 적용되는 조건들로 구성된 그리드의 필터를 명시하고 있다.
grid.FilterCriteria = (
new BinaryOperator("OrderDate", new DateTime(1995, 1, 1), BinaryOperatorType.Less) &
new BinaryOperator("UnitPrice", 10, BinaryOperatorType.Less)) |
( new BinaryOperator("OrderDate", new DateTime(1996, 1, 1), BinaryOperatorType.GreaterOrEqual) &
new BinaryOperator("UnitPrice", 100, BinaryOperatorType.GreaterOrEqual));
grid.FilterCriteria =
CriteriaOperator.Parse("([OrderDate] < #1/1/1995# AND [UnitPrice] < 10)" +
" OR ([OrderDate] >= #1/1/1996# AND [UnitPrice] >= 100)");
grid.FilterString = "([OrderDate] < #1/1/1995# AND [UnitPrice] < 10)" +
" OR ([OrderDate] >= #1/1/1996# AND [UnitPrice] >= 100)";
### **■ SetAutoFilterValue, GetAutoFilterValue, CustomRowFilter** #### **GetAutoFilterValue & SetAutoFilterValue** TableView의 ShowAutoFilterRow 속성을 True로 지정하면 자동필터행를 사용할 수 있다.
자동필터행을 사용하면 사용자가 텍스트를 행에 직접 입력하여 즉석에서 데이터를 필터링 할 수 있다. 코드에서 이 작업을 수행하려면 ColumnBase.AutoFilterValue 속성을 사용하면 된다.
ex) 그림1-1에서 Name열의 AutoFilterValue는 null이고, Age열의 AutoFilterValue는 "2"이다.
SetAutoFilterValue method 호출 순서
- CellEditor.OnEditValueChanged()
- ColumnBase.SetAutoFilterValue(Edit.EditValue)
- ColumnBase.OnAutoFilterValueChanged()
- ColumnBase.UpdateAutoFilter()
- ApplyColumnFilter(View != null && AutoFilterValue != null && !string.IsNullOrEmpty(AutoFilterValue.ToString()) ? (Owner as DataViewBase).CreateAutoFilterCriteria(FieldName, condition, AutoFilterValue) : null);
- DataControlBase.MergeColumnFilters
└ FilterCriteria = GroupOperator.And(merged.Values);
※ MergeColumnFilters : 각 열의 필터를 And 연산으로 결합시켜 FilterCriteria를 set 한다.
**GetAutoFilterValue method 호출 순서** 1. DataControlBase.OnFilterCriteriaChanged() 2. UpdateAutoFilterValue() 3. GetAutoFilterValue(this, op) └ 이 함수를 Overried해서 정의하면 그림 1-1의 Age에 표시되는 "2"라는 값을 Customizing 해줄 수 있다."
#### **CreateAutoFilterCriteria** SetAutoFilterValue method 호출 순서 5번째에서 호출된다.
#### **CustomRowFilter** 데이터 행을 수동으로 필터링 할때 사용되는 이벤트로 데이터 소스에 있는 특정 행을 숨기거나, 보이게 할 때 사용된다. Automatic Filter Row와 열의 filter dropdown에 사용되는 필터 기준보다 우선으로 적용된다. 이 이벤트는 데이터 소스의 각 레코드에 대해 발생한다.
private void grid_CustomRowFilter(object sender, RowFilterEventArgs e)
{
if (chkHideOdd.IsChecked.Value && e.ListSourceRowIndex % 2 == 1)
e.Visible = false;
if (chkHideEven.IsChecked.Value && e.ListSourceRowIndex % 2 == 0)
e.Visible = false;
e.Handled = !e.Visible ? true : false;
}
#### **FilterString, FilterCriteria 동기화** FilterString과 FilterCriter는 Changed 이벤트를 통해서 서로 동기화 된다. ``` cs void OnFilterCriteriaChanged() { // 필터 스트링 생성 string filterString = !object.ReferenceEquals(FilterCriteria, null) ? FilterCriteria.ToString() : string.Empty; if(filterString != FilterString) FilterString = filterString; foreach(ColumnBase column in ColumnsCore) column.UpdateAutoFilterValue();
ApplyFilter(FilterCriteria);
if(DataView != null) DataView.UpdateFilterPanel();
}
void OnFilterStringChanged() { if(object.ReferenceEquals(FilterCriteria, null)) { if(FilterString == string.Empty) return; } else { if(FilterCriteria.ToString() == FilterString) return; }
FilterCriteria = CriteriaOperator.TryParse(FilterString);
}
method 호출과 OnFilterCriteriaChanged(), OnFilterStringChanged() 소스코드는 DevExpress 문서에는 제공되지 않아
call stack과 소스코드로 분석한 대략적인 내용입니다.
그리드의 동작방식( Initialize될때, Item이 변경될 때, 코드에서 그리드 속성을 직접 변경할 때 )에 따라
호출되는 순서가 바뀔수도있고, 위에서 기술한 호출 순서와 다를 수도 있습니다.
하지만 call stack과 소스코드로 알아내기엔 한계가 있습니다...
잘못된 부분과 이해하는데 더 좋은 접근방법 및 문서가 있다면 알려주시면 감사하겠습니다.)
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>