質問者
Visual StudioのデータソースでBindingされたDataTableとDataGridにFilter機能を実装させたい

質問
-
vsのデザイナーでDataSetとDataTableを作成しました、そしてvsのデータソースを開き、DataTableをドラッグアンドドロップしてWindowにDataGridを作成しました。その時点でResourcesとBindingは自動的に作成されます。その繋がりはそのままでFilter機能を実装するにはどうすればよいのでしょうか?
<Window x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> <Window.Resources> <local:DataSet x:Key="dataSet"/> <CollectionViewSource x:Key="table1ViewSource" Source="{Binding Table1, Source={StaticResource dataSet}}"/> </Window.Resources> <Grid DataContext="{StaticResource table1ViewSource}"> <DataGrid x:Name="table1DataGrid" AutoGenerateColumns="False" ItemsSource="{Binding}"> <DataGrid.Columns> <DataGridTextColumn x:Name="categoryColumn" Binding="{Binding Category}" Header="Category" Width="SizeToHeader"/> <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Name}" Header="Name" Width="SizeToHeader"/> </DataGrid.Columns> </DataGrid> </Grid> </Window>
using System.Windows; namespace Test { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { Test.DataSet dataSet = ((Test.DataSet)(this.FindResource("dataSet"))); } } }
すべての返信
-
そのままのコードだとCollectionCiewSource.ViewがBindingListCollectionViewになってるはずなので、それに対してカスタムフィルターを定義してやります。
<Window x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <local:DataSet x:Key="dataSet"/> <CollectionViewSource x:Key="table1ViewSource" Source="{Binding Table1, Source={StaticResource dataSet}}"/> </Window.Resources> <DockPanel> <Button DockPanel.Dock="Bottom" Content="Tソート" Click="Button_Click" /> <Grid DataContext="{StaticResource table1ViewSource}"> <DataGrid x:Name="table1DataGrid" AutoGenerateColumns="False" ItemsSource="{Binding}"> <DataGrid.Columns> <DataGridTextColumn x:Name="categoryColumn" Binding="{Binding Category}" Header="Category" Width="SizeToHeader"/> <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Name}" Header="Name" Width="SizeToHeader"/> </DataGrid.Columns> </DataGrid> </Grid> </DockPanel> </Window>
namespace Test { using System; using System.Windows; using System.Windows.Data; public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Test.DataSet dataSet = (Test.DataSet)this.Resources["dataSet"]; var row=dataSet.Table1.NewTable1Row(); row.Category="かてごり1"; row.Name="ABC"; dataSet.Table1.AddTable1Row(row); row = dataSet.Table1.NewTable1Row(); row.Category = "かてごり1"; row.Name = "XYZ"; dataSet.Table1.AddTable1Row(row); row = dataSet.Table1.NewTable1Row(); row.Category = "かてごり2"; row.Name = "1234"; dataSet.Table1.AddTable1Row(row); row = dataSet.Table1.NewTable1Row(); row.Category = "かてごり2"; row.Name = "5678"; } private void Button_Click(object sender, RoutedEventArgs e) { CollectionViewSource cvs = (CollectionViewSource)this.Resources["table1ViewSource"]; System.Windows.Data.BindingListCollectionView view; view = cvs.View as System.Windows.Data.BindingListCollectionView; if (view != null) { if (view.CanCustomFilter) { view.CustomFilter = "Category Like '*1'"; } } } } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
knskj727さん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
>collectionViewSouce_FilterとかDataRow[]とか試しましたが、無理でした。
→何かの困難がありましたか。エラーメッセージが表示された場合は、ご共有いただけますでしょうか。
また、gekkaさんの提案も試しました。 これは、Filter関数を実装する方法です。
それを試していただければと思います。
どうぞよろしくお願いいたします。MSDN/ TechNet Community Support Haruka
~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~