[英]WPF DataGrid - Change value row by row in “real time”
我正在創建這個 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 中執行期間添加一些項目,然后按下按鈕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.