首页 > 解决方案 > WPF DataGrid - “实时”逐行更改值

问题描述

我正在创建这个 DataGrid:

DataTable _dt = new DataTable("MyDataTable");
_dt.Columns.Add("ID", typeof(int));
_dt.Columns.Add("File", typeof(string));
_dt.Columns.Add("Folder", typeof(string));
_dt.Columns.Add("Status", typeof(string));
_dt.Columns["ID"].AutoIncrement = true;
_dt.Columns["ID"].AutoIncrementSeed = 1;
_dt.Columns["ID"].AutoIncrementStep = 1;

FilesGridView.SelectionMode = DataGridSelectionMode.Extended;

FilesGridView.ItemsSource = _dt.DefaultView;

然后用文件路径列表填充它。

当我点击Process按钮时,我想遍历网格中的所有行并逐行更改 Status 列的

所以我写了这个:

private void ProcessButton_Click(object sender, RoutedEventArgs e)
{
    foreach (DataRowView row in FilesGridView.ItemsSource)
    {
        row["Status"] = "Processing...";
        System.Threading.Thread.Sleep(2000);    //letting 2 sec pass as a test
    }
}

但发生的情况是它开始计算,并且在 2 秒后 * 循环中的迭代已经过去,表一次全部更改。

我正在寻找的是进入 foreach 循环,它正在更改第一行的显示值,然后等待 2 秒并更改第二行的显示值,依此类推。

我错过了什么?我该如何做到这一点?

标签: c#wpfdatagrid

解决方案


如果您需要在循环运行时显示更新进度,您只需要一点异步编程。只需使您的事件处理程序方法异步并在任务中运行循环,如下所示:

private async void Process_OnClick(object sender, RoutedEventArgs e) {
    await Task.Run(async () => {
        foreach (DataRowView row in this.FilesGridView.ItemsSource) {
            row["Status"] = "Processing...";
            await Task.Delay(2000);
        }
    });
}

我测试了这个项目中的代码。检查主窗口。在 DataGrid 中执行期间添加一些项目,然后按下按钮。


推荐阅读