WPF中,我使用了datagrid,我想请问下当我向数据库添加了新的数据,我该怎么刷新datagrid里面的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中,我使用了datagrid,我想请问下当我向数据库添加了新的数据,我该怎么刷新datagrid里面的数据?相关的知识,希望对你有一定的参考价值。

WPF中,我使用了datagrid,我想请问下当我向数据库添加了新的数据,我该怎么刷新datagrid里面的数据?有什么办法可以刷新datagrid?

看清楚是wpf,没有refresh方法的。

可以用定时重新获取数据,重新赋值给DataGrid绑定的后台属性,赋值完记得fire一个PropertyChanged事件,详见INotifyPropertyChanged 参考技术A datagrid如何实时刷新展示绑定的数据?
使用dg.ItemSource绑定了一个List<>数据源,然后在timer事件中动态改变List<>表中的数据,可界面不实时刷新,只有重新绑定才能展示最新数据,但用户当前选择的行信息什么的都丢了。

有什么好办法让dataGrid实时刷新,反映绑定的数据呢?
还有,设置dg.ItemSource后,dataGrid会默认选中第一单元格,如何使得dataGrid不自动进行默认选择啊?最好设置dg.ItemSource什么都不选中。

------解决方案--------------------------------------------------------
要实时刷新行 需要 用 ObservableCollection这个集合 命名空间System.Collections.ObjectModel
如果要实时刷新行里的某一列 还要实现INotifyPropertyChanged接口 命名空间System.ComponentModel
C# code
public class Data : INotifyPropertyChanged

private int _Jan;
public int Jan

get return _Jan;
set _Jan = value; NotiFy("Jan");

public event PropertyChangedEventHandler PropertyChanged;
public void NotiFy(string property)

if (PropertyChanged != null)

PropertyChanged(this, new PropertyChangedEventArgs(property));



twoway是双向的,就你问题提的oneway就可以了,
ObservableCollection<T> 和 INotifyPropertyChanged
其实WPF的数据绑定功能很强大的

WPF DataGrid ComboBox 导致 InvalidOperationException

【中文标题】WPF DataGrid ComboBox 导致 InvalidOperationException【英文标题】:WPF DataGrid ComboBox causes InvalidOperationException 【发布时间】:2011-03-28 13:32:29 【问题描述】:

当我尝试编辑组合框列的值时,我从我的数据网格中收到 InvalidOperationException(在 AddNew 或 EditItem 事务期间不允许使用'DeferRefresh'。)。我展示的所有项目都引用了同一列表中的另一个项目,所以这就是我使用组合框的目的。它与数据网格绑定到同一个集合。我正在处理的应用程序针对 .NET 3.5,但我已经整理了一个与 .NET 4 中完全相同的示例,因为数据网格是内置的。以下是数据网格中项目的代码:

public class TestItem : INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    
        if (PropertyChanged != null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        
    

    private int m_ID;
    private string m_Name;
    private int m_OppositeID;

    public int ID
    
        get  return m_ID; 
        set
        
            m_ID = value;
            RaisePropertyChanged("ID");
        
    
    public string Name
    
        get  return m_Name; 
        set
        
            m_Name = value;
            RaisePropertyChanged("Name");
        
    
    public int OppositeID
    
        get  return m_OppositeID; 
        set
        
            m_OppositeID = value;
            RaisePropertyChanged("OppositeID");
        
    

    public TestItem(int id, string name, int oppID)
    
        ID = id;
        Name = name;
        OppositeID = oppID;
    

这是我窗口中的代码:

public partial class MainWindow : Window, INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    
        if (PropertyChanged != null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        
    

    private ObservableCollection<TestItem> m_Items;

    public ObservableCollection<TestItem> Items
    
        get  return m_Items; 
        set
        
            m_Items = value;
            RaisePropertyChanged("Items");
        
    

    public MainWindow()
    
        InitializeComponent();
        this.DataContext = this;

        Items = new ObservableCollection<TestItem>();

        Items.Add(new TestItem(0, "Fixed", 0));
        Items.Add(new TestItem(1, "Left Side", 2));
        Items.Add(new TestItem(2, "Right Side", 1));
    

最后是我的 xaml:

<Window x:Class="DataGrid_Combo_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="Binding Path=Items" AutoGenerateColumns="False">
            <DataGrid.Resources>
                <Style x:Key="ItemsSourceStyle" TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="Binding Path=DataContext.Items, RelativeSource=RelativeSource AncestorType=x:Type Window"/>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="Binding Path=ID" Header="ID" Width="*"/>
                <DataGridTextColumn Binding="Binding Path=Name" Header="Name" Width="*"/>
                <DataGridComboBoxColumn Header="Opposite Item" Width="*" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="Binding Path=OppositeID" ElementStyle="StaticResource ItemsSourceStyle" EditingElementStyle="StaticResource ItemsSourceStyle"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

提前感谢您提供的任何帮助!

【问题讨论】:

这似乎与 Connect(connect.microsoft.com/VisualStudio/feedback/details/591125/…) 和 MSDN 论坛(social.msdn.microsoft.com/Forums/en-US/wpf/thread/…) 上报告的问题有关;但这是迄今为止最优雅的解决方法! 我遇到了这个问题,因为我错误地将我的 DataGrid 和 DataGridComboBoxColumn 绑定到同一个集合。 【参考方案1】:

我发现了如何解决这个问题。

我在 Window.Resources 中创建了一个这样的 CollectionViewSource:

<Window.Resources>
    <CollectionViewSource x:Key="itemSource" Source="Binding Path=Items"/>
</Window.Resources>

然后将我的组合框列定义更改为以下内容:

<DataGridComboBoxColumn Header="Opposite Item" Width="*" DisplayMemberPath="Name" SelectedValuePath="ID" SelectedValueBinding="Binding Path=OppositeID" ItemsSource="Binding Source=StaticResource itemSource"/>

【讨论】:

【参考方案2】:

CollectionViewDataGridXYZ.Items 上调用Refersh 之前尝试以下顺序

DataGridX.CommitEdit();

DataGridX.CancelEdit();

为我工作。

【讨论】:

发布的代码只是对问题的简短演示。真正的应用程序使用 mvvm,这种方法意味着附加事件处理程序等。

以上是关于WPF中,我使用了datagrid,我想请问下当我向数据库添加了新的数据,我该怎么刷新datagrid里面的数据?的主要内容,如果未能解决你的问题,请参考以下文章

WPF,请问DataGrid的复合表头是如何做的

使用WPF MVVM过滤datagrid,它可以工作,但我不知道为什么

在WPF中使用DataGrid如何实现行冻结的功能

在wpf设计的界面中,我通过DataGrid建立列表,我想通过点击列表头进行排序。

排序时复选框在 WPF Datagrid 中重置

C# WPF DataGrid 时间字段 显示AM PM,我想飞改成24小时格式。例如:2017/12/1 17:43:53