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