簡體   English   中英

WPF DataGrid - “實時”逐行更改值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM