C# 使用INotifyPropertyChanged刷新数据绑定的数据网格?
我已经在WPF中创建了一个数据绑定datagrid:“ActionResults”,当我运行应用程序时,它会显示数据库表的内容 IT部门将在SQLServerManagementStudio中手动更新“ActionResult”表。如果对表进行了任何更改,则只有在重新启动应用程序后,这些更改才会显示在datagrid中。我想添加一个“更新”按钮,它将重新刷新datagrid,显示对表所做的任何更改 我以前试着用类似的东西进行黑客攻击C# 使用INotifyPropertyChanged刷新数据绑定的数据网格?,c#,wpf,wpfdatagrid,observablecollection,inotifypropertychanged,C#,Wpf,Wpfdatagrid,Observablecollection,Inotifypropertychanged,我已经在WPF中创建了一个数据绑定datagrid:“ActionResults”,当我运行应用程序时,它会显示数据库表的内容 IT部门将在SQLServerManagementStudio中手动更新“ActionResult”表。如果对表进行了任何更改,则只有在重新启动应用程序后,这些更改才会显示在datagrid中。我想添加一个“更新”按钮,它将重新刷新datagrid,显示对表所做的任何更改 我以前试着用类似的东西进行黑客攻击 actionResultsDataGrid.Items.Ref
actionResultsDataGrid.Items.Refresh();
但决定继续进行可观察的收集。所以我一直在遵循教程,唯一的问题是他手动创建他的记录,我将使用数据库。到目前为止,我的情况如下:
//XAML
<Window x:Class="WpfApplication2.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" 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:WpfApplication2" Loaded="Window_Loaded">
<Window.Resources>
<CollectionViewSource x:Key="actionResultsViewSource" d:DesignSource="{d:DesignInstance my:ActionResult, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource actionResultsViewSource}">
<DataGrid AutoGenerateColumns="True" EnableRowVirtualization="True" ItemsSource="{Binding}" Name="actionResultsDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="0,0,0,85">
<DataGrid.Columns>
<DataGridTextColumn x:Name="idColumn" Binding="{Binding Path=Id}" Header="Id" Width="SizeToHeader" />
<DataGridTextColumn x:Name="actionColumn" Binding="{Binding Path=Action}" Header="Action" Width="SizeToHeader" />
</DataGrid>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="388,253,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>
</Window>
还有MainWindow.xaml.cs中的我的按钮
private void button1_Click(object sender, RoutedEventArgs e)
{
}
我的问题是,在学习该教程之后,他创建了另一个类“ActionResults”,并手动添加记录,但我使用的是db表。我该怎么办?请告诉我我卡住了。可观察的集合在哪里形成
多谢各位
编辑
我建议采用以下更简单的方法: 将从数据库读取数据的代码移动到单独的方法。 添加对ObservableCollection的调用。在开始处清除。 在应用程序启动时调用该方法,并在按钮中单击事件处理程序。 根据编辑,最简单的方法是在填充数据表之前清除数据表:
private void Load_ActionResult_Table()
{
ActionResultsTable.ActionResultDataSet actionResultDataSet = ((ActionResultsTable.ActionResultDataSet)(this.FindResource("actionResultDataSet")));
// Load data into the table ActionResult. You can modify this code as needed.
ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter actionResultDataSetActionResultTableAdapter = new ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter();
// Clear the table
actionResultDataSet.ActionResult.Clear();
actionResultDataSetActionResultTableAdapter.Fill(actionResultDataSet.ActionResult);
System.Windows.Data.CollectionViewSource actionResultViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("actionResultViewSource")));
actionResultViewSource.View.MoveCurrentToFirst();
}
为什么不将从db读取数据的代码移动到一个方法中,添加对ObservableCollection的调用。在开始时清除,并在应用程序启动和按钮单击处理程序中使用该方法?啊,我怎么没有想到这个lol…感谢markus的回复,效果很好。另一方面,我是否与以前的方法相差很远?INotifyPropertyChanged方法可能也会起作用,但我认为效果会稍高一些。您需要将ItemsSource绑定到集合属性,就像您对ObservanleCollection所做的那样。您创建一个新集合并通知网格属性已更改,而不是向网格通知ObservableCollection在内部执行的集合更改。这也是一种有效的方法。我的db表中的可观察集合是什么?我尝试过actionResultDataGrid.ItemSource=null;加载动作结果表;但是空值会将其删除,我如何才能清除它?@John:如果到目前为止您还没有可观察到的收集,那么您不需要。如果通过将网格分配给ItemsSource将其直接绑定到表,只需重新加载该表并将其分配给ItemSource即可。我错过什么了吗?您能否显示加载数据并将其绑定到网格的代码?
private void Load_ActionResult_Table()
{
ActionResultsTable.ActionResultDataSet actionResultDataSet = ((ActionResultsTable.ActionResultDataSet)(this.FindResource("actionResultDataSet")));
// Load data into the table ActionResult. You can modify this code as needed.
ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter actionResultDataSetActionResultTableAdapter = new ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter();
actionResultDataSetActionResultTableAdapter.Fill(actionResultDataSet.ActionResult);
System.Windows.Data.CollectionViewSource actionResultViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("actionResultViewSource")));
actionResultViewSource.View.MoveCurrentToFirst();
}
private void Refresh_Table_Button_Click(object sender, RoutedEventArgs e)
{
//SO DO I NEED TO SAY, SET TABLE TO NULL THEN RELOAD BY USING BELOW FUNCTION?
Load_ActionResult_Table();
}
private void Load_ActionResult_Table()
{
ActionResultsTable.ActionResultDataSet actionResultDataSet = ((ActionResultsTable.ActionResultDataSet)(this.FindResource("actionResultDataSet")));
// Load data into the table ActionResult. You can modify this code as needed.
ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter actionResultDataSetActionResultTableAdapter = new ActionResultsTable.ActionResultDataSetTableAdapters.ActionResultTableAdapter();
// Clear the table
actionResultDataSet.ActionResult.Clear();
actionResultDataSetActionResultTableAdapter.Fill(actionResultDataSet.ActionResult);
System.Windows.Data.CollectionViewSource actionResultViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("actionResultViewSource")));
actionResultViewSource.View.MoveCurrentToFirst();
}