如何在WPF中刷新数据网格

41

我的数据源在MySQL数据库中,我已经创建了一条更新命令,现在需要刷新DataGrid

MySqlCommand cmd = new MySqlCommand(
  "update request set status = " + StatusRequest(value) + 
  " where id = " + rowView[0].ToString() + "", conn);
MySqlDataReader myReader = cmd.ExecuteReader();

我如何刷新我的DataGrid

7个回答

78
尝试使用mydatagrid.Items.Refresh()

3
对我没有用。我正在使用 WPF .NET Core 3.1 - nam

60

在更新后重新加载网格的数据源

myGrid.ItemsSource = null;
myGrid.ItemsSource = myDataSource;

从我的测试来看,这似乎比其他答案建议的调用GetDefaultView快得多。 - edtheprogrammerguy
请注意,这将重新触发您的DataGrid中的所有事件(例如CheckBox点击、ComboBox选择等),这让我花费了很多时间才弄清楚。 - Zer0
这种方法虽然可行,但在XAML方面的绑定方面存在问题。 - N.I.R.E.X

21

来自MSDN -

CollectionViewSource.GetDefaultView(myGrid.ItemsSource).Refresh();

只要你的"data"的内存地址不变,这对我来说是可行的!(我正在使用WPF与postgresql绑定到HashSet<custom>) - undefined

12

更新的物品怎么样?它可以处理更新吗? - Leonardo
@Leonardo 为此,您需要让您的对象实现 INotifyPropertyChanged 接口。https://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx - D.Rosado
这根本什么也不做。 - Kim Homann
@KimHomann,如果您是通过{binding}设置项目,则清除保存项目的类,然后再次使用“手动刷新”> your_class.add(new items)。如果您是通过代码后台设置项目(例如yourDataGrid.ItemsSource = someClass),则使用:yourDataGrid.ItemsSource = null; 然后再次设置itemsSource。 - RAMM-HDR
我再次使用ObservableCollection,但它并不是一个可观察的集合。我进行了一些更改,但观察者(即网格)没有做任何事情。现在我又不得不再次查找代码,找出在其他地方是如何使其工作的。 - Paul McCarthy

5
如何?
mydatagrid.UpdateLayout();

不是刷新,而是如果我刷新程序资源更新,我需要在线时间刷新。 - Johniek Comp
@NikhilAgrawal 对我没用。我正在使用 WPF .NET Core 3.1 - nam

1
如果您想更新单行数据:
创建一个新的ObservableCollection并初始化它。
public ObservableCollection<myModel> myObservableCollection { get; set; } = new ObservableCollection<myModel>();

更新行

//Get current row as your model
var row = myDataGrid.CurrentItem as myModel;
//Find in your collection index of selected row
var b = myObservableCollection.IndexOf(myObservableCollection.FirstOrDefault(e=>e.Id == row.Id));
//Create a copy of this row
var k = row.Clone() as myModel;
//Here you can mofidy what you want
k.Name = "New name";
k.SomethingId = 2137;
//Replace object in you collection
myObservableCollection[b] = k;

这里是克隆模型的代码。
public object Clone()
{
    return this.MemberwiseClone();
}

该死,我甚至不知道你可以这样初始化一个属性。 - manit

1
我在这方面遇到了很多麻烦,以下是帮助我重新加载DataGrid以显示新值的方法。确保您使用从数据源获取的数据类型来获取最新的数据值。

我在下面用SomeDataType表示了它。

DataContext.Refresh(RefreshMode.OverwriteCurrentValues, DataContext.SomeDataType);

希望这能帮助到有相同问题的人。

注意:这需要在您的引用中包含System.Data.Linq - mcalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接