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

  • 質問

  • 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")));
            }
        }
    }


    2019年12月3日 11:02

すべての返信

  • そのままのコードだとCollectionCiewSource.ViewBindingListCollectionViewになってるはずなので、それに対してカスタムフィルターを定義してやります。

    <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 2019年12月3日 14:18
    • 回答としてマークされていない knskj727 2019年12月3日 14:18
    2019年12月3日 14:00
  • ありがとうございます。まだまだ理解できないことだらけなので助かります。

    collectionViewSouce_FilterとかDataRow[]とか試しましたが、無理でした。

    (CollectionViewSouce)this.Resouce["table1ViewSouce"]

    でつまづいていました。

    2019年12月4日 11:07
  • knskj727さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    >collectionViewSouce_FilterとかDataRow[]とか試しましたが、無理でした。
    →何かの困難がありましたか。エラーメッセージが表示された場合は、ご共有いただけますでしょうか。

    また、gekkaさんの提案も試しました。 これは、Filter関数を実装する方法です。 
    それを試していただければと思います。


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月9日 1:26
    モデレータ