私は比較的 WPF と C# に慣れていません。この例に従って、データグリッド (surveyresponsesDataGrid) をフィルタリングするために使用するデータグリッドと 2 つのコンボボックス (FileName と PartID) を含むフォームを作成しました。
WPF フォームの XAML は次のとおりです。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
Title="Review Data" Height="446" Width="987" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:SWA_IFR" Loaded="Window_Loaded">
<Window.Resources>
<CollectionViewSource
Source="{Binding ElementName=surveyresponses, Path=FileName.SelectedItem}"
x:Key="cvs" Filter="fn_Filter"
x:Name="srView"
CollectionViewType="{x:Type dat:ListCollectionView}" />
</Window.Resources>
<Grid>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="247" HorizontalAlignment="Left"
ItemsSource="{Binding Source={StaticResource cvs}}" Margin="12,93,0,0" Name="surveyresponsesDataGrid"
RowDetailsVisibilityMode="VisibleWhenSelected" VerticalAlignment="Top" Width="941">
<DataGrid.Columns>
<DataGridTextColumn x:Name="fileUploadNameColumn" Binding="{Binding Path=FileUploadName}" Header="File Upload Name" Width="*" />
<DataGridTextColumn x:Name="participantIDColumn" Binding="{Binding Path=ParticipantID}" Header="Participant ID" Width="*" />
<DataGridTextColumn x:Name="quesIDColumn" Binding="{Binding Path=QuesID}" Header="Ques ID" Width="*" />
<DataGridTextColumn x:Name="quesTypeColumn" Binding="{Binding Path=QuesType}" Header="Ques Type" Width="*" />
<DataGridTextColumn x:Name="scoreIntColumn" Binding="{Binding Path=ScoreInt}" Header="Score Int" Width="*" />
<DataGridTextColumn x:Name="scoreTextColumn" Binding="{Binding Path=ScoreText}" Header="Score Text" Width="*" />
<DataGridTextColumn x:Name="scoreDescrColumn" Binding="{Binding Path=ScoreDescr}" Header="Score Descr" Width="*" />
</DataGrid.Columns>
</DataGrid>
<ComboBox Height="29" HorizontalAlignment="Left" Margin="184,17,0,0" Name="FileName" VerticalAlignment="Top" Width="211" SelectionChanged="FileName_SelectionChanged" />
<Label Content="Filter by File Upload Name" Height="29" HorizontalAlignment="Left" Margin="14,17,0,0" Name="label2" VerticalAlignment="Top" Width="159" />
<ComboBox Height="29" HorizontalAlignment="Left" Margin="184,52,0,0" Name="PartID" VerticalAlignment="Top" Width="211" />
<Label Content="Filter by Participant ID" Height="29" HorizontalAlignment="Left" Margin="14,52,0,0" Name="label1" VerticalAlignment="Top" Width="159" />
</Grid>
これが私のコードです:
public 部分クラス ReviewData : Window
{ SMEntities context = new SMEntities(); public ReviewData() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { var filename = context.surveyresponses.Select(f => f.FileUploadName).Distinct(); this.FileName.ItemsSource = filename; var partid = context.surveyresponses.Select(p => p.ParticipantID).Distinct(); this.PartID.ItemsSource = partid; } void fn_Filter(object sender, FilterEventArgs e) { if (e.Item is surveyresponse) e.Accepted = (e.Item as surveyresponse).FileUploadName.ToUpper().Contains(FileName.Text.ToUpper()); else e.Accepted = true; } private void RefreshList() { if (surveyresponsesDataGrid.Items is CollectionView) { CollectionViewSource csv = (CollectionViewSource)FindResource("cvs"); if (csv != null) csv.View.Refresh(); } } private void srFilter_TextChanged(object sender, TextChangedEventArgs e) { RefreshList(); } } }
最初の問題は、CollectionViewSource が Window.Resource セクションで正しくセットアップされているとは思わないことですが、何がオフなのかについての明確なガイダンスが見つかりません。EF クラスは surveyresponses ですが、Path 属性を正しく設定したかどうかはわかりません。現在、最初のコンボボックス FileName の SelectedItem に設定されています。私の目標は、FileName コンボボックスでの選択に一致するエントリのみのデータグリッドをフィルタリングすることです。
2 番目の問題は、最初のフィルターが設定されると、PartId コンボボックスを選択すると、2 番目のフィールド (参加者 ID) に基づいてデータグリッドがさらにフィルター処理されるように、2 番目のフィルターを使用する方法がわからないことです。
基本的なものが欠けていて、それが何であるかわかりません。
ご指導ありがとうございます。