ASPxGridView и LinqServerModeDataSource: вставка и обновление строк без отображения всех столбцов в сетке

Как мне использовать LinqServerModeDataSource для вставки или редактирования строк базовой таблицы данных, когда я не показываю все поля этой таблицы в ASPxGridView?

Задавались аналогичные вопросы, но это не повторение. Например, этот спрашивает о LinqServerModeDataSource и принятом ответ расскажет, как пользоваться обычным SqlDataSource.

У меня ASPxGridView подключен к столу через LinqServerModeDataSource. Но я не показываю все столбцы в сетке. Например, есть столбцы для даты создания и некоторые другие, о которых пользователю не нужно знать. Я разрешаю встроенное редактирование в сетке, но в событии Inserting или Updating переданные новые значения представляют собой просто словарь значений, отображаемых в сетке.

А как насчет других ценностей? Я ожидал, что смогу установить любое из значений для базовой строки данных программно в обработчике событий, независимо от того, отображаются ли они и, таким образом, редактируются пользователем. Как мне получить к ним доступ и установить другие значения в событиях LinqServerModeDataSource? Мне не повезло с чтением документации devexpress.

Я предполагаю, что должен быть класс Linq, который подключается к таблице, которую я могу использовать в этих событиях, аналогично событию Selecting. Но как?

Вот как выглядит обработчик событий Selecting ... Нет ли аналогичного интерфейса, который я мог бы использовать для доступа к базовым данным в других событиях?

protected void dsRecipients_Selecting(object sender, DevExpress.Data.Linq.LinqServerModeDataSourceSelectEventArgs e)
{
    SmsRecipientsDataContext context = new SmsRecipientsDataContext();
    IQueryable<NotificationParty> val = context.NotificationParties;

    int notificationGroupID = Convert.ToInt32(Context.Session["NotificationGroupID"]);
    val = val.Where(n => n.NotificationGroupID == notificationGroupID && n.Active);

    e.KeyExpression = "ID";
    e.QueryableSource = val;
}

person Jerome Viveiros    schedule 16.07.2015    source источник


Ответы (1)


Как бы я ни ненавидел отвечать на свой вопрос ...

Я не могу понять, как заставить этот элемент управления делать то, что я хочу. Однако простой обходной путь - обработать вставку и обновление в самой сетке.

Итак, теперь он работает. Я устанавливаю свойства EnableUpdate и EnableInsert в LinqServerModeDataSource на false и просто обрабатываю события RowInserting и RowUpdating сетки, где я перехожу непосредственно к базе данных.

Например, мой обработчик события вставки таков:

protected void recipientsGrid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
{
    using (SqlConnection connection = new SqlConnection(App_Logic.Wrappers.DatabaseConnectionString()))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand())
        {
            command.Connection = connection;
            command.Transaction = connection.BeginTransaction();
            try
            {
                command.CommandText = " INSERT INTO NotificationParty(NotificationGroupID, FirstName, LastName, CellNumber, Active, UserCreated, DateCreated) VALUES " +
                    "(@NotificationGroupID, @FirstName, @LastName, @CellNumber, @Active, @UserCreated, GETDATE())";

                command.Parameters.AddWithValue("@NotificationGroupID", Convert.ToInt32(Context.Session["NotificationGroupID"]));
                command.Parameters.AddWithValue("@FirstName", e.NewValues["FirstName"]);
                command.Parameters.AddWithValue("@LastName", e.NewValues["LastName"]);
                command.Parameters.AddWithValue("@CellNumber", e.NewValues["CellNumber"]);
                command.Parameters.AddWithValue("@Active", 1);
                command.Parameters.AddWithValue("@UserCreated", Session["UID"]);

                command.ExecuteNonQuery();
                command.Transaction.Commit();
            }
            catch
            {
                command.Transaction.Rollback();
            }
        }
    }

    recipientsGrid.CancelEdit();
    e.Cancel = true;
}

И мой обработчик событий обновления таков:

protected void recipientsGrid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
{
    using (SqlConnection connection = new SqlConnection(App_Logic.Wrappers.DatabaseConnectionString()))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand())
        {
            command.Connection = connection;
            command.Transaction = connection.BeginTransaction();
            try
            {
                command.CommandText = " UPDATE NotificationParty SET FirstName = @FirstName, LastName = @LastName, CellNumber = @CellNumber, UserModified = @UserModified, DateModified = GETDATE() WHERE ID = @ID";

                command.Parameters.AddWithValue("@ID", e.Keys[0]);
                command.Parameters.AddWithValue("@FirstName", e.NewValues["FirstName"]);
                command.Parameters.AddWithValue("@LastName", e.NewValues["LastName"]);
                command.Parameters.AddWithValue("@CellNumber", e.NewValues["CellNumber"]);
                command.Parameters.AddWithValue("@UserModified", Session["UID"]);

                command.ExecuteNonQuery();
                command.Transaction.Commit();
            }
            catch
            {
                command.Transaction.Rollback();
            }
        }
    }

    recipientsGrid.CancelEdit();
    e.Cancel = true;
}
person Jerome Viveiros    schedule 16.07.2015