Как поймать ConstraintException, когда DataRow добавляется из GridView? - PullRequest
3 голосов
/ 24 сентября 2019

Я использую DevExpress GridControl для создания формы, позволяющей пользователю вводить данные.Сетка привязана к DataTable с одним столбцом, определенным как уникальный как его источник данных.

DataTable dtDetail = new DataTable();
dtDetail.Columns.Add("ProductID", typeof(int));
dtDetail.Columns.Add("ProductName", typeof(string));
dtDetail.Columns.Add("OrderQty", typeof(int));
dtDetail.Columns.Add("LossTolerance", typeof(decimal));

dtDetail.Columns["ProductID"].Unique = true;

gridView.DataSource = dt;

Обычно мы можем добавлять строки и обрабатывать нарушение ограничений с помощью этого кода:

try
{    
    dtDetail.Rows.Add(1, "Some product name", 10, 2);
}
catch (ConstraintException ex)
{
    // The default ex.Message is something like: Column 'ProductID' is constrained to be unique. Value xxxx is already present. 
    // I need to display this message in my local language.
}

Форма, которую я разработал, является формой ввода данных, поэтому данные поступают от конечного пользователя черезсетка.Когда строка добавляется пользователем, метод dtDetail.Rows.Add вызывается каким-то образом, и я не знаю, как правильно обработать ConstraintException, поскольку добавленная строка исходит из сетки, а не напрямую из моего кода.

Когда будет добавлен дубликат ProductID, появится MessageBox с точным текстом в ex.Message, с двумя кнопками YesNo, спрашивающими, хотим ли мы исправить значения или нет.

Моя цель - сохранить все строки в пределах DataTable уникальными.Мне нужно обработать ConstraintException, чтобы я мог отобразить пользовательское сообщение об ошибке для конечного пользователя.Я искал некоторые сообщения в документации SO и Microsoft, например:

но это не дает мне понять, как это сделать.

Может ли кто-нибудь помочь мне, как это сделать?На самом деле, мой код работает правильно, мне просто нужно обработать исключение.Извините за мой плохой английский.Английский не мой родной язык.Спасибо.

1 Ответ

0 голосов
/ 24 сентября 2019

Как прокомментировал Олег в разделе комментариев для использования события ValidateRow, я могу решить свое требование, используя другое событие, которое фактически связано с этим событием, а именно InvalidRowException

private void gridView_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
{
    // Get the type of exception
    if (e.Exception.GetType() == typeof(ConstraintException))
    {
        // Get the unique constraint column
        using (DataColumn constraintColumn = ((UniqueConstraint)dtDetail.Constraints[0]).Columns[0])
        {
            // Get the value that violates unique constraint
            object value = ((DataRowView)e.Row).Row[constraintColumn];

            DialogResult dr = XtraMessageBox.Show(string.Format("Kolom {0} diatur sebagai Unique. Nilai {1} telah ada sebelumnya. Apakah Anda ingin memperbaiki barisnya?", constraintColumn.ColumnName, value.ToString()), "Informasi", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

            if (dr == DialogResult.Yes)
            {
                // No action. User can correct their input.
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
            }
            else
            {
                // Duplicate row will be removed
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.Ignore;
            }
        }
    }
}

ИспользуяПриведенный выше код, я могу обработать ConstraintException и отображать пользовательское сообщение об ошибке для моего пользователя.

Спасибо.

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