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 호출 순서
- DataControlBase.OnFilterCriteriaChanged()
- UpdateAutoFilterValue()
- 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>