轉帖|其它|編輯:郝浩|2012-01-05 00:06:05.000|閱讀 1024 次
概述:過濾是DataGrid這樣的表格控件的基本功能之一,也是非常重要的特性。微軟提供的標準DataGrid相信大家都很熟悉了。本文要解析的不是 標準DataGrid,而是Silverlight和WPF平臺下的C1DataGrid的過濾功能。經過多年的打磨,最新的ComponentOne 2011 v3版中的C1DataGrid已經具有了很多不同以往的過濾技術,每一種都很容易使用而且功能強大。這里將會展示幾個例子和效果圖,希望對大家有用。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
過濾是DataGrid這樣的表格控件的基本功能之一,也是非常重要的特性。微軟提供的標準DataGrid相信大家都很熟悉了。本文要解析的不是 標準DataGrid,而是Silverlight和WPF平臺下的C1DataGrid的過濾功能。經過多年的打磨,最新的ComponentOne 2011 v3版中的C1DataGrid已經具有了很多不同以往的過濾技術,每一種都很容易使用而且功能強大。這里將會展示幾個例子和效果圖,希望對大家有用。
默認過濾
把一個IEnumerable數據源綁定到C1DataGrid上,設置CanUserFilter為true,就可以看到默認條件下的過濾結果。過濾器會根據用戶輸入的條件,列出過濾結果,比如“大于10”或者“包含R”。
根據不同列的數據類型,C1DataGrid還提供了特殊的過濾器。比如日期類型或者布爾類型的列中,可以選擇適合的條件過濾器,如下圖所示:
高級過濾器
C1.Silverlight.DataGrid.Filters.dll中提供了很多高級的過濾功能。這樣做的好處是,如果你需要這些高級特性,那么就添加該dll到項目里。如果不需要,那它不會對項目的size造成影響。
行過濾
另外一種基本的過濾功能可通過典型的過濾行來實現。過濾行是由一些文本框組成的固定行,用戶可以在改行的文本框中輸入過濾條件。在 C1DataGrid中可以通過TopRows或BottomRows非常便捷的實現行過濾功能,只需為其添加一個DataGridFilterRow類 型的元素(請確保你添加了C1.Sliverlight.DataGrid.Filters程序集的引用),然后設置固定行數即可。
<c1:C1DataGrid Name="c1DataGrid1" CanUserFilter="True" FrozenTopRowsCount="1"
RowHeight="30">
<c1:C1DataGrid.TopRows>
<c1:DataGridFilterRow />
</c1:C1DataGrid.TopRows>
</c1:C1DataGrid>
全文過濾
C1DataGrid提供了對整個Grid中文本進行過濾的功能,用戶可一次性完成所有列的檢索或過濾操作。而這一切,只需為FullTextSearchBehavior屬性綁定一個控件,例如:TextBox控件,它就會為你自動完成剩下的工作。
<c1:C1DataGrid Name="c1DataGrid1" CanUserFilter="True" Margin="0,27,0,0">
<c1:C1FullTextSearchBehavior.FullTextSearchBehavior>
<c1:C1FullTextSearchBehavior Filter=
"{Binding ElementName=textBox1, Path=Text}" />
</c1:C1FullTextSearchBehavior.FullTextSearchBehavior>
</c1:C1DataGrid>
<TextBox Height="23" HorizontalAlignment="Left"
Name="textBox1" VerticalAlignment="Top" Width="177" />
多值過濾
C1DataGrid提供了類似于Excel那樣的多值過濾功能。可作為過濾條件的值以選擇列表的形式顯示,用戶可以選擇那些值顯示,那些不顯示,這為擁有唯一或者重復值的列提供了非常有效的過濾方式(例如:類別或類型列)。你可以通過兩種方法實現多值過濾功能。
第一種方法是利用C1DataGrid內置的高級過濾特性。只需為Grid添加 一個C1AdvancedFiltersBehavior類,這樣就為Grid添加了內置的高級過濾功能,包括多值過濾。
<c1:C1DataGrid Name="c1DataGrid1"
AutoGenerateColumns="False"
CanUserFilter="True" CanUserAddRows="False" RowHeight="30">
<!—設置高級過濾器-->
<c1:C1AdvancedFiltersBehavior.AdvancedFiltersBehavior>
<c1:C1AdvancedFiltersBehavior />
</c1:C1AdvancedFiltersBehavior.AdvancedFiltersBehavior>
</c1:C1DataGrid>
通過C1AdvancedFiltersBehavior為Grid中的列添加了簡單過濾和多值過濾功能,這并沒有使用太多的控件,是為整個Grid添加高級過濾功能的最簡單方法。
第二種方法會靈活一些。你可以將高級過濾功能關閉,直接在XAML或代碼中為每一列指定特殊的過濾類型,下面演示如何為某一列添加多值過濾功能:
<c1:C1DataGrid Name="c1DataGrid1"
ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">
<c1:C1DataGrid.Columns>
<c1:DataGridTextColumn Header="Flavor" Binding="{Binding FlavorName}" FilterMemberPath="FlavorName">
<!—添加多值過濾器-->
<c1:DataGridTextColumn.Filter>
<c1:DataGridContentFilter >
<c1:DataGridMultiValueFilter ItemsSource=
"{Binding Flavors}" DisplayMemberPath=
"FlavorName" ValueMemberPath="FlavorName" MaxHeight="200"/>
</c1:DataGridContentFilter>
</c1:DataGridTextColumn.Filter>
</c1:DataGridTextColumn>
<!—其它列信息-->
<c1:DataGridCheckBoxColumn Header=
"Has Nuts" Binding="{Binding IncludesNuts}" FilterMemberPath="IncludesNuts" />
<c1:DataGridTextColumn Header=
"Percent" Format="p1" Binding=
"{Binding Percent}" FilterMemberPath="Percent"/>
</c1:C1DataGrid.Columns>
</c1:C1DataGrid>
需要注意的是,上面的方法是為多值過濾器指定ItemsSource來實現的。
多條件過濾
多條件過濾是對缺省過濾的一種擴展,你可以一次設置多個過濾條件,過濾條件的個數沒有限制,可根據用戶的需求設置相應的數量。
就像上面的多值過濾一樣,你可以在XAML中通過設置Filter屬性來定制過濾功能。例如,你可以為Text類型的列添加C1MultiLineTextFilter來實現多條件過濾功能(也可以為DateTime和Numeric類型的列設置多條件過濾)。
<c1:C1DataGrid Name="c1DataGrid1"
AutoGenerateColumns="False" CanUserFilter="True">
<c1:C1DataGrid.Columns>
<c1:DataGridTextColumn Header="Flavor"
Binding="{Binding FlavorName}" FilterMemberPath="FlavorName">
<!—添加條件過濾器-->
<c1:DataGridTextColumn.Filter>
<c1:DataGridContentFilter >
<c1:DataGridMultiLineTextFilter />
</c1:DataGridContentFilter>
</c1:DataGridTextColumn.Filter>
</c1:DataGridTextColumn>
<!—添加其它列 -->
...
</c1:C1DataGrid.Columns>
</c1:C1DataGrid>
組合過濾
通過組合過濾,用戶可以一次設置多種類型的過濾條件。C1DataGrid本身支持多種類型的過濾器,你可以使用DataGridFilterList為每列添加多種類型的過濾器。
例如,你想同時使用文本和數字過濾器,就可以通過下面的代碼來實現:
<c1:C1DataGrid Name="c1DataGrid1" ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">
<c1:C1DataGrid.Columns>
<c1:DataGridTextColumn Header="Flavor"
Binding="{Binding FlavorName}" FilterMemberPath="FlavorName" />
<c1:DataGridCheckBoxColumn Header="Has Nuts"
Binding="{Binding IncludesNuts}" FilterMemberPath="IncludesNuts" />
<c1:DataGridTextColumn Header="Percent"
Format="p1" Binding="{Binding Percent}" FilterMemberPath="Percent">
<c1:DataGridTextColumn.Filter>
<c1:DataGridContentFilter >
<c1:DataGridFilterList>
<c1:DataGridTextFilter />
<c1:DataGridNumericFilter Format="p1" />
</c1:DataGridFilterList>
</c1:DataGridContentFilter>
</c1:DataGridTextColumn.Filter>
</c1:DataGridTextColumn>
</c1:C1DataGrid.Columns>
</c1:C1DataGrid>
為模板列添加過濾功能
模板列不支持缺省的過濾功能,但可以通過設置Filter屬性來定制過濾功能。例如,通過下面的代碼可以為模板列添加一個多值過濾功能:
<c1:C1DataGrid Name="c1DataGrid1"
ItemsSource="{Binding Flavors}" AutoGenerateColumns="False" CanUserFilter="True">
<c1:C1DataGrid.Columns>
<!—添加模板列-->
<c1:DataGridTemplateColumn Header="Flavor"
FilterMemberPath="FlavorName">
<c1:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding FlavorName}" />
</DataTemplate>
</c1:DataGridTemplateColumn.CellTemplate>
<!—添加多值過濾器-->
<c1:DataGridTemplateColumn.Filter>
<c1:DataGridContentFilter >
<c1:DataGridMultiValueFilter ItemsSource="{Binding Flavors}" MaxHeight="200" DisplayMemberPath="FlavorName" ValueMemberPath="FlavorName" />
</c1:DataGridContentFilter>
</c1:DataGridTemplateColumn.Filter>
</c1:DataGridTemplateColumn>
<!—添加其它列-->
...
</c1:C1DataGrid.Columns>
</c1:C1DataGrid>
通過代碼設置過濾功能
有些情況下,需要在代碼中控制過濾功能,C1DataGrid為此提供了兩個非常重要的事件。FilterLoading在每列的過濾器加載后觸發,你可以在這個事件中設置自定義的過濾器。FilterOpened在過濾器被打開之后觸發,此時可以動態設置一些選項的值。
下面演示如何使用代碼設置一個多值過濾器:
private void dataGrid_FilterLoading(object sender,
DataGridColumnEditableValueEventArgs<IDataGridFilter> e)
{
var column = e.Column;
var multiValueFilter = new DataGridMultiValueFilter();
(e.Value as DataGridFilter).InnerControl = multiValueFilter;
}
下面演示如何使用代碼為多值列表設置數據:
void dataGrid_FilterOpened(object sender,
DataGridColumnValueEventArgs<IDataGridFilter> e)
{
var boundColumn = e.Column as DataGridBoundColumn;
if (boundColumn == null)
return;
// 創建并設置多值過濾器
var filterControl = (DataGridMultiValueFilter)((DataGridFilter)e.Value).InnerControl;
filterControl.ItemsSource = items.Select(selector).Distinct().OrderBy(o => o);
}
用戶自定義過濾器
C1DataGrid的過濾功能不局限于上面提到的幾種方式,你可以實現你需要的自定義過濾器,然后將這個過濾器設置給特定的列。根據數據的不同,你可以設置一個樹形結構、直方圖或者日歷形式的過濾器,你可以在C1DataGrid的例子中找到相應的實現。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載