ASPxGridView dan LinqServerModeDataSource: Memasukkan dan memperbarui baris tanpa menampilkan semua kolom di grid

Bagaimana cara menggunakan LinqServerModeDataSource untuk menyisipkan atau mengedit baris tabel data yang mendasarinya ketika saya tidak menampilkan semua bidang tabel tersebut di ASPxGridView?

Pertanyaan serupa telah ditanyakan, tapi ini bukan duplikat. Misalnya, yang ini menanyakan tentang LinqServerModeDataSource dan yang diterima jawaban memberitahu cara menggunakan SqlDataSource biasa.

Saya memiliki ASPxGridView yang terhubung ke tabel melalui LinqServerModeDataSource. Tapi saya tidak menampilkan semua kolom di grid. Misalnya, ada kolom untuk tanggal pembuatan dan beberapa lainnya yang tidak perlu diketahui pengguna. Saya mengizinkan pengeditan sebaris di kisi, namun pada peristiwa Inserting atau Updating, nilai baru yang diteruskan hanyalah kamus dari nilai yang ditampilkan di kisi.

Bagaimana dengan nilai-nilai lainnya? Saya berharap dapat menetapkan nilai apa pun untuk baris data yang mendasarinya secara terprogram di pengendali peristiwa, terlepas dari apakah nilai tersebut ditampilkan dan diedit oleh pengguna. Bagaimana cara saya mendapatkan akses ke sana dan menetapkan nilai lainnya di acara LinqServerModeDataSource? Saya tidak beruntung membaca dokumentasi devexpress.

Saya menduga pasti ada kelas Linq yang terhubung ke tabel yang dapat saya gunakan dalam acara tersebut, mirip dengan acara Selecting. Tapi bagaimana caranya?

Berikut tampilan event handler Selecting... Apakah tidak ada antarmuka serupa yang dapat saya gunakan untuk mengakses data dasar di event lain?

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 sumber


Jawaban (1)


Betapapun aku benci menjawab pertanyaanku sendiri...

Saya tidak tahu bagaimana cara mendapatkan kontrol ini untuk melakukan apa yang saya inginkan. Namun, solusi sederhananya adalah dengan menangani penyisipan dan pembaruan pada kisi itu sendiri.

Jadi, ini berfungsi sekarang. Saya mengatur properti EnableUpdate dan EnableInsert pada LinqServerModeDataSource ke false, dan cukup menangani kejadian RowInserting dan RowUpdating pada grid, di mana saya langsung menuju ke database.

Misalnya, event handler penyisipan saya adalah ini:

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;
}

Dan pengendali acara pembaruan saya adalah ini:

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