DataGrid C#的实时更新

Posted

技术标签:

【中文标题】DataGrid C#的实时更新【英文标题】:Realtime update of DataGrid C# 【发布时间】:2022-01-15 16:30:01 【问题描述】:

我正在创建一个 UI 以可视化模拟器的某些部分。我应该以表格格式呈现一些值,但是当表格已经初始化时,我无法让表格持续更新(它使用正确的值初始化,但是当你查看它时它是静态的,所以你必须转到另一个页面然后返回以更新表格) 这是代码:

<Page x:Class="SimulatorUI.RawDataPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:SimulatorUI"
      mc:Ignorable="d" 
      d:DesignHeight="950" d:DesignWidth="750"
      Title="RawDataPage">

    <DataGrid Name="dataTable" MinWidth="500" Margin="10 10 10 10" HorizontalContentAlignment="Center" HorizontalAlignment="Center"/>
</Page>

而c#代码是这样的

    public partial class RawDataPage : Page

    List<TankModule> tankList;
    public RawDataPage(List<TankModule> list)
    
        tankList = list;
        InitializeComponent();
        List<displayModule> data = loadTable();
        dataTable.ItemsSource = data;
        Task.Run(() => updateLoop());   
    
    public List<displayModule> loadTable()
    
        List<displayModule> modules = new List<displayModule>();
        foreach(TankModule tank in tankList)
        
            modules.Add(new displayModule(tank));
        
        return modules;
         
    internal async Task updateLoop()
    
        for (; ; )
        
            dataTable.ItemsSource = null;
            dataTable.ItemsSource = loadTable();
            await Task.Delay(1000);
        
    

【问题讨论】:

我认为您应该尝试将 DataTable 的 ItemsSource 属性绑定到 ObservableCollection Modules 属性,然后更新该属性。 谢谢,会调查这个!我在 C# 方面的经验非常有限,需要详细说明吗? 【参考方案1】:

数据绑定在这些情况下效果最好。

tankListList 更改为 ObservableCollection 开始,然后将 DataGrid 绑定到 坦克列表。现在,每当您在 tankList 中添加或删除新项目时,DataGrid 都会更新以反映更改。

代码隐藏应该是这样的:

// Add this using to use ObservableCollection
using System.Collections.ObjectModel;

public partial class RawDataPage : Page

    // I've renamed tankList to TankList, as it is a convention to name public properties in Pascal case
    public ObservableCollection<TankModule> TankList  get; set; 

    public RawDataPage(List<TankModule> list)
    
        DataContext = this; // This will bind this instance as the data context of the view

        tankList = new ObservableCollection<TankModule>(list);
    

在视图中:

<Page x:Class="SimulatorUI.RawDataPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:SimulatorUI"
      mc:Ignorable="d" 
      d:DesignHeight="950" d:DesignWidth="750"
      Title="RawDataPage">

    <DataGrid Name="dataTable" ItemsSource="Binding TankList" MinWidth="500" Margin="10 10 10 10" HorizontalContentAlignment="Center" HorizontalAlignment="Center"/>
</Page>

注意:如果您修改 TankList 中的项目,视图可能不会更新。在这种情况下,TankModule 类必须实现 INotifyPropertyChanged。 你也可以在修改列表项后做这样的事情来刷新列表:

ObservableCollection<TankModule> copy = TankList;
TankList = null;
TankList = copy;

另外,建议使用视图模型而不是在代码隐藏中执行所有这些操作。

【讨论】:

以上是关于DataGrid C#的实时更新的主要内容,如果未能解决你的问题,请参考以下文章

C#的wpf工程中由于datagrid中的数据一直在更新所以每次选中某一行时,数据一更新选中就会被取消掉

WPF datagrid 更新数据库

更新单个单元格的 UWP DataGrid 样式

如何在 C# 中更新或刷新与 Ms-access 连接的数据网格视图

vb中datagrid控件怎么更新?

c# datagridview 滚动条问题