Для лучшей пользовательской информации я добавил столбец, который отображает 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);
}