Cách tốt nhất để quản lý thứ tự sắp xếp danh sách với UI Kéo và Thả là gì?


10

Tôi có một danh sách Sinh viên mà tôi sẽ hiển thị cho người dùng trên một trang web ở định dạng bảng.
Các mục được lưu trữ trong DB cùng với thông tin Sắp xếp.

Trên trang web, người dùng có thể sắp xếp lại thứ tự danh sách bằng cách kéo và thả các mục vào thứ tự sắp xếp mong muốn của họ, tương tự như bài đăng này .

Dưới đây là một ảnh chụp màn hình trang thử nghiệm của tôi.
nhập mô tả hình ảnh ở đây

Trong ví dụ trên, mỗi hàng có thông tin thứ tự sắp xếp kèm theo nó. Khi tôi thả John Doe (Id sinh viên 10) lên trên hàng Id sinh viên 1, thứ tự danh sách sẽ là: 2, 10, 1, 8, 11.

Cách lạc quan (ít đói tài nguyên) để lưu trữ và cập nhật thông tin Sắp xếp thứ tự là gì?

Ý tưởng duy nhất của tôi bây giờ là, đối với mọi thay đổi trong thứ tự sắp xếp của danh sách, giá trị Sắp xếp của mọi đối tượng nên được cập nhật, theo ý kiến ​​của tôi là rất đói tài nguyên.

Chỉ cần FYI: Tôi có thể có nhiều nhất 25 hàng trong bảng của mình.


1
Bạn có cần duy trì thứ tự sắp xếp này ở phía máy chủ không, hay chỉ có ở phía máy khách là đủ?
răn đe

1
Tôi nên lưu trữ thứ tự trên phía máy chủ. Không thành vấn đề nếu đơn hàng được lưu trữ trên mỗi lần kéo thả hoặc bằng cách nhấp vào nút một lần và mãi mãi.
Alexander

Câu trả lời:


10

Tôi đã nghĩ về một cái gì đó, có thể làm giảm các truy vấn của bạn. Ở đây trong ví dụ của tôi, tôi đã thêm một cái mới columnđể sắp xếp có tên pos. Vì vậy, ban đầu mà không có bất kỳ kéo, bảng của bạn sẽ như thế nào -

Trạng thái ban đầu

Bây giờ, hãy xem xét rằng bạn đã kéo Item 4giữa Item 1& Item 2. Bây giờ, posgiá trị mới Item 4sẽ là (20 + 10) / 2, đó là 15. Vì vậy, Bạn sẽ chỉ cần cập nhật một hàng trong cơ sở dữ liệu. Và, bạn sẽ nhận được -

Sau khi kéo

Dưới đây là một sơ đồ với các trường hợp cạnh. ilà chỉ mục mảng mới của hàng của bạn sau khi được kéo -

Sơ đồ

Lưu đồ này không xử lý ArrayOutOfBoundkiểm tra. Và, đối với các trường hợp cạnh, bạn sẽ cần nhiều hơn một truy vấn.

Vì bạn chỉ có 25 hàng, bạn có thể lấy một giá trị rất lớn (ví dụ 10,000) cho chênh lệch pos (tôi lấy 10ví dụ này). Giá trị càng lớn, nó sẽ càng ít va chạm.


Đây là một cách tiếp cận tốt đẹp. Lưu ý rằng bạn sẽ phải tính toán lại toàn bộ (hoặc một phần lớn) thông tin đặt hàng nếu không có chỗ nào để chèn một mặt hàng. Nó sẽ là một sự kiện đủ hiếm để đưa ra.
9000

@ 9000 bạn có thể sử dụng số thập phân thay vì số nguyên để tránh sự cố.
Rifat

nếu bạn có Item Avị trí 123 và Item Cvị trí 124, không có cách nào dễ dàng để đặt Item B giữa chúng. Một giải pháp sẽ là sử dụng các số phân số (ví dụ: float), nhưng chúng cũng có độ chính xác hạn chế. Đôi khi, bạn nên thực hiện việc đánh số lại, chuẩn hóa các khoảng thời gian và giữ mọi thứ đơn giản.
9000

Vì vậy, khi bạn làm i--, bạn chỉ bị trừ đi 1. Không có khoảng thời gian khác mà bạn có thể trừ đi để ngăn va chạm cuối cùng?
muttley91

@Rifat thậm chí số thập phân có độ chính xác hạn chế, vì vậy chúng cũng sẽ va chạm.
SCI

3

Cá nhân tôi sẽ trả về một mảng JSON cho dữ liệu từ phía sau. Sau đó, tôi sẽ sử dụng JavaScript (JQuery hoặc loại trực tiếp) để hiển thị và sắp xếp và sắp xếp lại dữ liệu. Bằng cách đó, việc sắp xếp không tải trên máy chủ.


0

Bạn đang tìm kiếm một cách thân thiện với tài nguyên để xử lý điều này nhưng quan điểm thân thiện với người dùng cũng là điều bắt buộc. Tôi đề nghị các yêu cầu riêng lẻ sau mỗi mục sắp xếp lại. Mỗi cuộc gọi cho phép bạn kiểm tra nếu được chấp nhận hoặc thất bại.

  • Phản hồi thất bại sẽ đặt lại chế độ xem và hiển thị thông báo cho người dùng cuối.
  • Yêu cầu chấp nhận đơn giản cho phép tiếp tục chỉnh sửa.

Ngoài ra, sử dụng một đối tượng JSON (@ tom-squires) là một ý tưởng tốt để giảm chi phí HTTP và xử lý phía máy chủ nhưng cuối cùng cần nhiều mã hơn để xử lý các yêu cầu ở phía máy chủ và máy khách. Nếu điều đó là ổn, việc truyền đối tượng đến máy chủ là hiệu quả nhất về mặt kỹ thuật. Nó cũng cho phép trì hoãn vài giây để cho phép nhiều lần sắp xếp lại trước một yêu cầu, nếu bạn muốn điều này.

Hãy ghi nhớ, để cung cấp cho người dùng phản hồi từ các yêu cầu không thành công, bạn sẽ phải phân tích một đối tượng JSON phản hồi từ máy chủ để tìm ra mục nào bị lỗi và đặt lại UI dựa trên đó.


-1

Một cái gì đó như thế này trong trình xử lý sự kiện thả, trong đó e là sự kiện DnD.

        ....
        if (e.Action == DragAction.Drop)
        {
            foreach(var item in Items)
            {
                if (e.NewIndex == e.OldIndex) // Dropped in same place
                    return;
                if(e.OldIndex > e.NewIndex) // Moved Up
                {
                    if (item.SortOrder >= e.NewIndex && item.SortOrder < e.OldIndex)
                    {
                        item.SortOrder ++;
                    }
                }
                else // Moved Down
                {
                    if (item.SortOrder> e.OldIndex && item.SortOrder < e.NewIndex) 
                    {
                        item.SortOrder --;
                    }
                }   
            }
            ((Student)e.ItemData).SortOrder = e.NewIndex;
        }
    ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.