WPF DataGrid - меняйте значение построчно в режиме реального времени - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю эту 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;

, а затем заполняю ее списком путей к файлам.

Когда я нажимаю кнопку Процесс , я хочу l oop через все строки в сетке и изменить значение столбца 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 секунды * итерации в l oop истекают, таблица меняется сразу.

Я искал, что вход в foreach l oop, он изменял отображаемое значение первой строки, затем ожидал 2 se c и изменял отображаемое значение второй строки и т. д.

Чего мне не хватает? Как мне этого добиться?

1 Ответ

1 голос
/ 22 апреля 2020

Если вам нужно отображать ход выполнения обновлений во время работы l oop, вам просто нужно немного асинхронного программирования. Просто сделайте ваш метод обработчика событий асинхронным и запустите l oop внутри Задачи, например:

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, а затем нажмите кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...