【问题标题】:WPF DataGrid grouping datasWPF DataGrid 分组数据
【发布时间】:2021-03-21 17:02:41
【问题描述】:

这是我在网上找到的一篇文章,用于在 WPF Datagrid 中整理数据: Grouping in DataGrid in WPF

我想在 WPF 应用程序中使用来自实体框架 DataContext 的数据对其进行测试。 首先我想检查DataGrid 中的数据是否正确实现。 但是DataGrid 保持为空。 这是可能的xaml

<UserControl x:Class="GESTION_CONGELATION_V2.User_Controls.ViewPvi_UC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <DataGrid x:Name="Pvi_DT">
        
    </DataGrid>
</UserControl>

我的 .cs

public partial class ViewPvi_UC : UserControl
{
    ObservableCollection<VW_PVI_2> pvi = new ObservableCollection<VW_PVI_2>();
    public ViewPvi_UC()
    {
        InitializeComponent();
        ObservableCollection<VW_PVI_2> pvi = new ObservableCollection<VW_PVI_2>();
        Pvi_DT.ItemsSource = pvi;
    }
}

和我的实体框架类

public partial class VW_PVI_2
{
    public int PVI_ID { get; set; }
    public string VE_NOM { get; set; }
    public string VD_VIRTUAL { get; set; }
    public string VE_OLD_NAME { get; set; }
    public string ST_LIB { get; set; }
    public string VE_COMM { get; set; }
    public string IMP_NOM { get; set; }
    public string IMP_IP { get; set; }
    public string IMP_MAC { get; set; }
    public string ST_LIB_IMP { get; set; }
    public string IMP_COMM { get; set; }
    public string SERV_NOM { get; set; }
    public string PO_NOM { get; set; }
}

和数据网格中的结果

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您可以将pvi 声明更改如下,以使用ICollectionView

    public partial class ViewPvi_UC : UserControl
    {
        public ICollectionView pvi { get; set; }
        public ViewPvi_UC()
        {
            InitializeComponent();      
        }
    
        async private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            await Task<object>.Factory.StartNew(() =>
            {
                // Select all `VW_PVI_2` from your table here to be populate the `pvi`
                IList<VW_PVI_2> data= YourDbContext.YourTable.Select(r => r).ToList();
                pvi = new ObservableCollection<VW_PVI_2>(data);
                this.Dispatcher.Invoke(() => {  Pvi_DT.ItemsSource = pvi; });
                return Task.FromResult<object>(null);
            });
        }
    }
    

    在 XAML 中添加 Loaded 事件:

    <UserControl ...
        d:DesignHeight="450" d:DesignWidth="800"
        Loaded="Window_Loaded">
        <DataGrid x:Name="Pvi_DT">
            
        </DataGrid>
    </UserControl>
    

    从表中加载数据被移动到Loaded 事件处理程序并异步执行。因为加载数据可能需要一些时间。因此可以实现一些逻辑来显示正在加载数据的消息,以指示用户有关此过程的信息。

    如果您想隐藏某些列(例如PVI_ID),可以使用自定义属性:

    public class HiddenAttribute : Attribute
    {
    }
    
    public partial class VW_PVI_2
    {
        [Hidden]
        public int PVI_ID { get; set; }
        ...
    }
    

    然后将AutoGeneratingColumn 事件处理程序声明添加到XAML 中的dataGrid

    <DataGrid x:Name="dataGrid1" AutoGeneratingColumn="Pvi_DT_AutoGeneratingColumn"/>
    

    以及隐藏某些列的处理程序声明:

    private void Pvi_DT_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyDescriptor is PropertyDescriptor prop && prop.Attributes.OfType<HiddenAttribute>().Any())
        {
            e.Cancel = true;
        }
    }
    

    【讨论】:

    • 感谢您的回答。只是一件事,我不知道之后要写什么:IList data= ??是从我的表中选择 * 吗?
    • @Jean François Collombet:没错。它应该任何 LINQ ti Entities 选择查询,例如:YourDbContext.YourTable.Select(row =&gt; row).ToList(); 查看教程:Linq-to-Entities QueryExecute Raw SQL Queries in Entity Framework 6。欢迎与您的帖子相关的任何其他问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2013-12-27
    • 2017-02-11
    • 2013-04-09
    • 1970-01-01
    • 2011-03-22
    • 2013-11-06
    相关资源
    最近更新 更多