Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用INotifyPropertyChanged刷新数据绑定的数据网格?_C#_Wpf_Wpfdatagrid_Observablecollection_Inotifypropertychanged - Fatal编程技术网

C# 使用INotifyPropertyChanged刷新数据绑定的数据网格?

C# 使用INotifyPropertyChanged刷新数据绑定的数据网格?,c#,wpf,wpfdatagrid,observablecollection,inotifypropertychanged,C#,Wpf,Wpfdatagrid,Observablecollection,Inotifypropertychanged,我已经在WPF中创建了一个数据绑定datagrid:“ActionResults”,当我运行应用程序时,它会显示数据库表的内容 IT部门将在SQLServerManagementStudio中手动更新“ActionResult”表。如果对表进行了任何更改,则只有在重新启动应用程序后,这些更改才会显示在datagrid中。我想添加一个“更新”按钮,它将重新刷新datagrid,显示对表所做的任何更改 我以前试着用类似的东西进行黑客攻击 actionResultsDataGrid.Items.Ref

我已经在WPF中创建了一个数据绑定datagrid:“ActionResults”,当我运行应用程序时,它会显示数据库表的内容

IT部门将在SQLServerManagementStudio中手动更新“ActionResult”表。如果对表进行了任何更改,则只有在重新启动应用程序后,这些更改才会显示在datagrid中。我想添加一个“更新”按钮,它将重新刷新datagrid,显示对表所做的任何更改

我以前试着用类似的东西进行黑客攻击

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();
}