c# - 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 秒并更改第二行的显示值,依此类推。
我错过了什么?我该如何做到这一点?
解决方案
如果您需要在循环运行时显示更新进度,您只需要一点异步编程。只需使您的事件处理程序方法异步并在任务中运行循环,如下所示:
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 中执行期间添加一些项目,然后按下按钮。
推荐阅读
- javascript - 无限平铺网页
- r - 当矩阵包含许多小条目时,base::chol() 会变慢
- python - Tkinter 部分点击通过?(仅限 Windows)
- css - 悬停时两个不同元素的转换延迟反转
- python - 将千位逗号分隔符添加到 Relplot
- python - 使用 Python 中的带阻滤波器滤除频率范围,并使用傅里叶变换 FFT 确认
- android - 无法使用 Fastlane 上传 aab/apk 来玩商店
- java - GraalVM native-image -H:ConfigurationFileDirectories 文件的文档
- php - PHP curl - 存在错误时获取响应标头?
- php - WordPress 自定义帖子类型存档不加载