在DataGrid中刷新数据太“浮华”

时间:2016-07-25 17:16:15

标签: c# wpf datagrid

我在 DispatcherTimer 中有一个方法,每3秒刷新一次datagrid的数据。 (测试目的为3秒)

问题在于每次刷新数据网格时,它都会清除所有数据,然后再次从我的数据库加载数据(显然)。现在我的问题是,每次加载数据时它都会创建这个“华丽”效果,因为所有行都被清除并重新加载到数据网格中。

所以我的问题是,(在你看了下面我的代码之后)是否有更好的方法一次又一次地加载数据而不在我的数据网格中创建闪烁效果?

我从WCF服务调用数据的方法:

public async Task LoadTrucks()
{
    using (TruckServiceClient service = new TruckServiceClient())
    {
        List<ClientItems> truckitems = new List<ClientItems>();
        if (dgViewProjects.Items.Count <= 0)
        {
            foreach (var item in await service.GetTrucksAsync())
            {
                truckitems.Add(new ClientItems
                {
                    TruckQuoteId = item.QuoteId,
                    TruckChassisManufacturer = item.ChassisManufacturer,
                    TruckChassisModel = item.ChassisModel,
                    TruckStatus = item.Status,
                    TruckJobNumber = item.JobNumbers,
                    TruckAddedBy = item.AddedBy,
                    TruckClient = item.ClientName
                });
            }
        }
        dgViewProjects.ItemsSource = (truckitems.ToArray());
    }
}

在这里,我调用LoadTrucks()方法并创建我的DispatcherTimer:

private async void dgViewProjects_Loaded(object sender, RoutedEventArgs e)
{
    await LoadTrucks();

    var timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(3);
    timer.Tick += new EventHandler(async (object o, EventArgs t) =>
    {
        dgViewProjects.ItemsSource = null;
        await LoadTrucks();
    });
    timer.Start();
}

2 个答案:

答案 0 :(得分:1)

检查具有给定键的项目是否已存在并更新其属性,而不是完全切换所有项目。

(就性能而言,这也是一个好主意,您当前的逻辑需要完全重新创建数据网格内容。)

答案 1 :(得分:1)

在实际应用中,您是否通过排队服务等方式以流式方式获取数据?

我问,因为不是替换所有数据而不是更新/插入而不是为了避免这种情况?

如果没有,你可以尝试这样的事情: In WPF, what is the equivalent of Suspend/ResumeLayout() and BackgroundWorker() from Windows Forms