Реагировать на изменение RowState DataRow - PullRequest
0 голосов
/ 06 мая 2019

Для лучшей пользовательской информации я добавил столбец, который отображает RowState текущей строки для пользователя в моей DataGrid.Для этого я написал обработчик событий, который прослушивает «измененные» события базового DataTable.Работает хорошо, отображает новые строки, неизмененные и измененные правильно.У меня только одна проблема.

Вопрос

DataRow является частью DataTable в DataSet данных, запрашиваемых из базы данных.Так что столбец rowstate работает нормально, пока я не вызову save для набора данных.Затем RowState изменится на «NotModified», но мои символы не изменятся.
Какой случай или метод я могу использовать, чтобы иметь возможность реагировать на изменение RowState после сохранения (или отклонения изменения также)?

Я не могу подключиться к методу «Сохранить», потому что я хочу работать универсально только над таблицей и строками.

Так есть решение для этого,или мне нужно настроить все мои методы сохранения?

Код

Для получения дополнительной информации я покажу код, который я использую для активации столбца RowState для моей DataGrid.

    /// <summary>
    ///     Adds a <see cref="DxIconColumn" /> to the <see cref="DxDataGrid" /> which displays the rowstate of the rows. Icons for modified, new and unchanged are added.
    ///     <para />
    ///     This method also works if the column is already defined manually and makes changed accordingly.
    ///     <para />
    ///     <b>Attention!</b> This method only works if the Datasource <see cref="DataTable" /> contains a columns with the specified name in <paramref name="rowStateColumnName" />.
    ///     This column is filled automatically with the rowstate.
    /// </summary>
    /// <param name="datagrid">The <see cref="DxDataGrid" /> to activate the column on</param>
    /// <param name="rowStateColumnName">Optional a different name of the rowstate column in the <see cref="DataTable" /></param>
    public static void ActivateOnGrid([NotNull] DxDataGrid datagrid, [NotNull] string rowStateColumnName = "cf_rowstate")
    {
        Guard.Parameter.NotNull(datagrid, "datagrid", "datagrid != null");
        Guard.Parameter.NotNull(rowStateColumnName, "rowStateColumnName", "rowStateColumnName != null");

        // first check that the DataSource contains the binding column we want to use for the rowstates. Otherwise we sadly have to cancel
        if (!datagrid.TableSource.HasColumn(rowStateColumnName))
        {
            LoggerSink.PushMessage(null, string.Format("Could not activate rowstate column for grid '{0}' because column '{1}' does not exist in the binded DataTable.", datagrid.Name, rowStateColumnName), Severity.Warning);
            return;
        }

        // First verify that we modify an existing column if it already exists
        var column = datagrid.Columns.OfType<DxIconColumn>()
            .FirstOrDefault(x => x.BindingPath == rowStateColumnName || x.Name.StartsWith("tirowstate", StringComparison.Ordinal));
        if (column == null)
        {
            column = new DxIconColumn
            {
                Name = string.Format("tirowstate_{0}", datagrid.Name),
                BindingPath = rowStateColumnName,
                Header = "",
                Width = 20,
                ImageHeight = 15,
                ImageWidth = 15,
                IsReadOnly = true,
                Visibility = Visibility.Visible,
                VisibleIndex = 0
            };
            datagrid.Columns.Add(column);
        }

        // Verify that the different icons exist.
        var neededIcons = new[]
        {
            new { RowState = EnumRowState.NotModified, Icon = clientGlobals.Icons.LedGray },
            new { RowState = EnumRowState.EditingNew, Icon = clientGlobals.Icons.New },
            new { RowState = EnumRowState.Modified, Icon = clientGlobals.Icons.LedYellow }
        };

        // Add each missing icon
        foreach (var iconData in neededIcons)
        {
            if (column.Icons.Any(x => x.Condition.Contains(string.Format(@"""{0}""", iconData.RowState))))
                continue;

            var icon = new DxIcon
            {
                Condition = string.Format(@"@{0} == ""{1}""", rowStateColumnName, iconData.RowState),
                ImageName = iconData.Icon.ToString()
            };
            column.Icons.Add(icon);
        }

        // Now subscribe the event methods to update the rowstate column accordingly
        datagrid.DGItemChanged += (o, args) => SetRowStateOnSelectedRow(datagrid, rowStateColumnName);
        datagrid.CellValueChanged += (o, args) => SetRowStateOnSelectedRow(datagrid, rowStateColumnName);
        datagrid.New += (sender, args) => SetRowStateOnSelectedRow(datagrid, rowStateColumnName);
        datagrid.Loaded += (sender, args) => SetRowState(datagrid, rowStateColumnName);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...