ASPxGridView和LinqServerModeDataSource:插入和更新行,而不显示网格中的所有列

本文关键字:网格 显示 LinqServerModeDataSource 插入 更新 ASPxGridView | 更新日期: 2023-09-27 18:03:10

当我没有在ASPxGridView中显示该表的所有字段时,如何使用LinqServerModeDataSource来插入或编辑底层数据表的行?

类似的问题已经问过了,但这不是重复的。例如,这个问题是关于LinqServerModeDataSource的,而被接受的答案是如何使用普通的SqlDataSource

我有一个ASPxGridView通过LinqServerModeDataSource连接到一个表。但是我没有在网格中显示所有的列。例如,有用于创建日期的列,还有一些用户不需要知道的列。我允许在网格中进行内联编辑,但在InsertingUpdating事件中,传递的新值只是网格中显示的值的字典。

其他值呢?我希望能够在事件处理程序中以编程方式为底层数据行设置任何值,而不管它们是否显示并因此由用户编辑。如何访问它们并设置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;
}

ASPxGridView和LinqServerModeDataSource:插入和更新行,而不显示网格中的所有列

尽管我讨厌回答自己的问题…

我不知道如何让这个控件做我想做的事。然而,一个简单的解决方法是处理网格本身的插入和更新。

所以,它现在工作了。我将LinqServerModeDataSource上的EnableUpdateEnableInsert属性设置为false,并简单地处理网格的RowInsertingRowUpdating事件,在那里我直接进入数据库。

例如,我的插入事件处理程序是:
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;
}