【问题标题】:How to do both filtering and grouping listview from SQL如何从 SQL 中进行过滤和分组列表视图
【发布时间】:2016-05-23 03:40:13
【问题描述】:

我如何让我的 listview 同时进行分组和过滤,因为我只能让它一次做一件事。我几乎尝试了所有我能做的,但没有一个奏效。当我删除时

 public string SelectedParam { get { return _selectedParam; } set { _selectedParam = value; OnPropertyChanged("SelectedParam");
        if (_selectedParam == "Krydsmål") { BindData(); } else { hjuldata.ItemsSource = FilterKategori().Tables[0].DefaultView; ; } } }

然后分组有效,但过滤无效

我想知道我是否可以使用 sql 进行填充而不是同时进行填充和过滤,然后让 listview 像手动添加的项目一样进行过滤

我的过滤组合框:

 <ComboBox x:Name="Krydsmålbox" Foreground="#FFEAEAEA" Background="#FF303030" FontSize="12" 
Style="{StaticResource ComboBoxTest2}"  ItemTemplate="{StaticResource cmbTemplate2}" 
ItemsSource="{Binding}"  SelectedValuePath="Krydsmålene"
SelectedValue = "{Binding SelectedParam, RelativeSource={RelativeSource FindAncestor, 
                  AncestorType={x:Type Window}},UpdateSourceTrigger=PropertyChanged}" BorderBrush="#FF303030" Height="40" DockPanel.Dock="Top" Margin="586,42,379,0"/>

列表视图

 <ListView x:Name="hjuldata" BorderBrush="#FF303030" Foreground="#FF00FB0B"  ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" Background="#FF303030" ItemsSource="{Binding}" Margin="-160,242,11,22" Grid.ColumnSpan="6" Grid.Row="3" Style="{DynamicResource ListViewStyle2}" DockPanel.Dock="Bottom" Height="576">
 <ListView.View>
 <GridView>
 <GridView.ColumnHeaderContainerStyle>
 <Style TargetType="{x:Type GridViewColumnHeader}">
 <Setter Property="Background" Value="Black" />
 <Setter Property="Foreground" Value="#FFEAEAEA"/>
 <Setter Property="FontWeight" Value="Bold" />
 </Style>
 </GridView.ColumnHeaderContainerStyle>
 <GridViewColumn Header="" >
 <GridViewColumn.CellTemplate>
 <DataTemplate>
 <Image Source="{Binding Billed, Converter={StaticResource nullImageConverter}}" Width="20" Height="20" Stretch="Fill" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,15,0"/>
 </DataTemplate>
 </GridViewColumn.CellTemplate>
 </GridViewColumn>
 <GridViewColumn Header="Model" Width="140" >
 <GridViewColumn.CellTemplate>
 <DataTemplate>
 <TextBlock x:Name="Txt" Text="{Binding Model}" Foreground="#FF00FB0B" />
 </DataTemplate>
 </GridViewColumn.CellTemplate>
 </GridViewColumn>
 <GridViewColumn Header="Årgang" Width="100">
 <GridViewColumn.CellTemplate>
 <DataTemplate>
 <TextBlock x:Name="Txt" Text="{Binding Årgang}" Foreground="#FF00FB0B" />
 </DataTemplate>
 </GridViewColumn.CellTemplate>
 </GridViewColumn>
 <GridViewColumn Header="Motor Type" Width="150" >
 <GridViewColumn.CellTemplate>
 <DataTemplate>
 <TextBlock x:Name="Txt" Text="{Binding [Motor Type]}" Foreground="#FF00FB0B" />
 </DataTemplate>
 </GridViewColumn.CellTemplate>
 </GridViewColumn>
 <GridViewColumn>
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding Krydsmålet}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn>
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding Centerhul}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn Header="ET" Width="auto">
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding ET}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn Header="Bolter" Width="100">
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding Bolter}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn Header="Dæk" Width="300">
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding Dæk}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  <GridViewColumn Header="Fælge" Width="200">
  <GridViewColumn.CellTemplate>
  <DataTemplate>
  <TextBlock x:Name="Txt" Text="{Binding Fælge}" Foreground="#FF00FB0B" />
  </DataTemplate>
  </GridViewColumn.CellTemplate>
  </GridViewColumn>
  </GridView>
  </ListView.View>

分组样式

  <ListView.GroupStyle>
  <GroupStyle>
  <GroupStyle.ContainerStyle>
  <Style TargetType="{x:Type GroupItem}">
  <Setter Property="Template">
  <Setter.Value>
  <ControlTemplate>
  <Expander IsExpanded="False"  BorderBrush="#FFEAEAEA" BorderThickness="0,0,0,1" >
 <Expander.Header>
 <StackPanel Orientation="Horizontal" DataContext="{Binding Items}">
 <Image Source="{Binding Billed, Converter={StaticResource nullImageConverter}}" Width="20" Height="20" Stretch="Fill" VerticalAlignment="Center"  Margin="0,0,15,0"/>
 <TextBlock  Text="{Binding Mærke}" FontWeight="Bold" Foreground="#FFEAEAEA" FontSize="22" VerticalAlignment="Bottom" />
 <TextBlock Text="{Binding Krydsmålene}"  FontWeight="Bold" Foreground="#FFFBFB00" FontSize="22" VerticalAlignment="Bottom" Margin="0,0,150,0" TextAlignment="Center" />
 </StackPanel>
 </Expander.Header>
 <ItemsPresenter />
 </Expander>
 </ControlTemplate>
 </Setter.Value>
 </Setter>
 </Style>
 </GroupStyle.ContainerStyle>
 </GroupStyle>
 </ListView.GroupStyle>
 </ListView>

CS:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _selectedParam;
    public MainWindow()
    {
        InitializeComponent();
        BindData();
        ICollectionView dataView = CollectionViewSource.GetDefaultView(hjuldata.ItemsSource);
        dataView.GroupDescriptions.Add(new PropertyGroupDescription("Mærke"));

    }

     public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string SelectedParam { get { return _selectedParam; } set { _selectedParam = value; OnPropertyChanged("SelectedParam");
    if (_selectedParam == "Krydsmål") { BindData(); } else { hjuldata.ItemsSource = FilterKategori().Tables[0].DefaultView; ; } } }

    private void BindData()
    {
        hjuldata.ItemsSource = Kategori().Tables[0].DefaultView;
    }
    public DataSet Kategori()
    {

        Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, P.Årgang, P.[Motor Type], P.Krydsmålet, P.Centerhul, P.ET,P.Bolter, P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P  inner join Data.Mærke PS on P.MærkeID = PS.MærkeID ORDER BY ps.Mærket";
        //SQL statement to fetch entries from Hjuldata
        DataSet dsdata = new DataSet();

        //Open SQL Connection
        using (conn = new SqlConnection(connStrings))
        {
            conn.Open();

            //Initialize command object                
            using (cmd = new SqlCommand(Data, conn))
            {                
                SqlDataAdapter adapters = new SqlDataAdapter(cmd);

                //Fill the result set

                adapters.Fill(dsdata);
                conn.Close();
            }
        }
        return dsdata;
    }

    public DataSet FilterKategori()
    {
        Data = @"Select ps.Mærket AS Mærke, P.DataID, P.Billed, P.Model, P.Årgang, P.[Motor Type], P.Krydsmålet, P.Centerhul, P.ET,P.Bolter, P.Dæk, P.Fælge ,PS.Krydsmålene from Data.Hjuldata P  inner join Data.Mærke PS on P.MærkeID = PS.MærkeID WHERE Krydsmålet = @param1";

        //SQL statement to fetch entries from products
        DataSet dsdata = new DataSet();

        //Open SQL Connection
        using (conn = new SqlConnection(connStrings))
        {
            conn.Open();

            //Initialize command object

            using (cmd = new SqlCommand(Data, conn))
            {
                cmd.Parameters.AddWithValue("@param1", SelectedParam);
                SqlDataAdapter adapters = new SqlDataAdapter(cmd);
                //Fill the result set
                adapters.Fill(dsdata);
                conn.Close();
            }
        }  
        return dsdata;
    }

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的列表视图似乎丢失了。

标签: c# sql-server wpf filtering grouping


【解决方案1】:

我认为您的问题是您使用的是 ADO.NET 数据视图抽象而不是 WPF 数据视图抽象,后者应该更易于使用。在 WPF 中,当您将集合或 DataTable 绑定到 ItemsControl 时,将创建一个数据视图对象,该对象基本上用作您的集合或 DataTable 上的一个层。通过这样做,您可能会将同一个集合绑定到多个 ItemsControls,但通过对为同一集合创建的两个不同数据视图进行不同的过滤和分组,从而获得该数据的不同“视图”。

在您的情况下,您绑定到DataTable,这比绑定到实现IList 的集合更混乱。对于 DataTable 有一个 DataView 类,它是 ADO.NET 的一部分,您的 WPF 数据视图基本上将用作一个层,而这个 DataView 在功能上更受限制(这个 ADO.NET DataView 是什么您当前正在您的代码中使用)。

无论哪种方式,要获得 WPF 数据视图,您只需要像这样询问ItemsSource

ICollectionView dataView = CollectionViewSource.GetDefaultView(myListView.ItemsSource);

现在您需要将ICollectionView 转换为对设置过滤器和分组更有用的东西。在您的情况下,您有一个DataTable,因此您需要将其转换为BindingListCollectionView。不幸的是,这比IListListCollectionView)获得的数据视图更有限,但你有一个DataTable,所以我们现在就继续使用它(我总是选择IList所以我以前从未在生产中实际实现过DataTable 绑定)。

BindingListCollectionView 没有可操作的Filter 属性,因此您必须使用它的CustomFilter 属性来指定要用于过滤集合的部分 SQL(基本上是您在WHERE 子句)。就分组而言,我从未在 DataTable 绑定上使用过它,但我希望它只是通过在数据视图上更新 GroupDescriptions 来工作。

因此,总的来说,我将获取 WPF 数据视图抽象,而不是您当前使用的 ADO.NET 数据视图抽象,并在其上设置过滤器和分组。此外,我建议将您的数据作为 IList 引入,或者将其转换为 IList,因为它们更容易在 WPF 中使用。

【讨论】:

  • Dataview 不支持分组,我已经使用ICollectionView dataView = CollectionViewSource.GetDefaultView(hjuldata.ItemsSource); 并使用hjuldata.ItemsSource = Kategori().Tables[0].DefaultView; 来调用它
  • 对。问题是您想在返回的 ICollectionView 上设置 Filter 和 Group(我在我的帖子中解释了如何为 DataTable 源执行此操作)。当您在代码中设置过滤后的数据时,您将 ItemsSource 设置为整个其他 ADO.NET DataView,这可能会吹走那里设置了分组的 ICollectionView。基本上,您应该直接在 ICollectionView 上进行过滤,如果您更新 ItemsSource,您应该重置分组和过滤器。
  • 我实际上通过使用dataView.Filter = SelectedParam; 来考虑这一点,但不幸的是SelectedParam 是一个字符串而不是一个对象,或者使用dataView.Filter = OnPropertyChanged("SelectedParam"); 但那是一个空白,所以我认为我可以将我的表设为一个类,但后来我遇到了另一个问题,因为我使用了 2 个表
  • 这行不通,因为从 DataTable 的源返回的 ICollectionView 是 BindingListCollectionView,并且其上的 Filter 属性没有做任何事情(调用 ICollectionView 上的 CanFilter 属性你回来将返回假)。您必须将 ICollectionView 转换为 BindingListCollectionView ,然后按照我的回答中所述使用 CustomFilter 属性。正如我之前提到的,使用 IList 作为源更容易,因为 Filter 属性可以直接使用。
  • 您是否有指向文档或指南的链接,以便我可以更清楚地了解如何做到这一点
【解决方案2】:

我认为这是您应该阅读的内容 How to: Group, Sort, and Filter Data in the DataGrid Control

我已经测试过它,它适用于您的数据结构,您不必对过滤做任何事情,只需更改分组部分和集合视图

【讨论】:

  • 现在工作的真棒我只需要弄清楚是否有一种方法可以在不使用分组和取消分组按钮的情况下做到这一点,以便它们始终分组
猜你喜欢
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多