Розширений GridView з функцією вставки - все про IT та програмування

ЗМІСТ

DataGrid був поганим, оскільки гордо заявляв, що робить все, що ви коли-небудь хотіли робити при відображенні табличних даних. Але він взагалі не робив добре те, що винен. Незважаючи на те, що він мав властивості AllowPaging та AllowSorting, доводилося вручну підключати гортання та сортування.

Єдиним недоліком є ​​відсутність убудованої підтримки вставки нових записів через GridView. Це доводиться робити на сторінках ведення списків. Раніше способом було додати порожній часовий рядок вгору GridView і дозволити користувачам вставляти через цей рядок. Нижче показано, як це має виглядати.

вставки

Загальний спосіб досягти цього полягає в наступному:

• Отримати дані • Змінити їх шляхом вставлення порожнього запису в самий початок (тобто індекс 0) • Зв'язати змінені дані з сіткою • Змінити розмір сторінки, оскільки перша сторінка повинна показувати вставлений рядок • Змінювати командні кнопки у міру зв'язування рядків

З огляду на вищезгаданого сторінки ведення списків вимагають частого повторення зайвої роботи. Тому GridView було розширено до підтримки такої вставки. Був скопійований принцип редагування рядка, тому його просто використовувати і прямо підтримувати його ставлення з джерелами даних.

Завдання було важким, в основному через з'ясування того, як GridView насправді працює всередині, що було зроблено завдяки чудовому інструменту дизасемблювання .NET Reflector.

Косметичні покращення

Зведення результатів

GridView часто застосовується для відображення результатів пошуку, а значить, в текстові елементи, що управляють, завжди вставляються фрази типу "Результати 1-10з 50", які треба завжди не забувати показувати і ховати, що нудно. Ось чому було додано "рядок зведення", що відображає цю інформацію автоматично. Зведення вставляє прямо над заголовком, але його можна перемістити в будь-яке потрібне вам місце.

Пара властивостей дозволяє включати і вимикати рядок зведення за бажанням і дає змогу видобути загальну кількість записів у джерелі даних, пов'язаному з GridView, відсутність якого завжди злило в минулому. Значення береться з методу InitializePager (опущеного тут, але наявного в демонстраційному проекті), який є вкрай корисним методом, гідним окремої статті.

Індикатори сортування

Раніше відсутність індикаторів сортування стовпців заважала. Тепер дві нові властивості дозволяють встановити зображення зростання та спадання. Можна вставити зображення як веб-ресурсів і використовувати їх як стандартні. Зображення вставляються у відповідний стовпець у рядку заголовка, коли він ініціалізується методом InitializeRow.

InitializeRow – ще один цікавий метод, що дозволяє виконувати додаткові завдання під час ініціалізації кожного рядка. Можна уявити його як внутрішній OnRowCreated, але з великим доступом до способу створення ряду.

Функція вставки

При реалізації цієї функції хотілося підтримувати якнайбільше існуючих функцій у каркасі, особливо під час роботи з джерелами даних та прив'язці даних до сітки. Також хотілося, наскільки це можливо, відтворити існуючий інтерфейс для збереження однаковості, тому в першу чергу було введено дві нові події, RowInserting і RowInserted, які спрацьовують безпосередньо перед і відразу після здійснення фактичної вставки, як і з RowUpdating і RowUpdated. Також було створено дваКористувальницькі класу EventArg, GridViewInsertEventArgs і GridViewInsertedEventArgs, щоб супроводжувати ці події, також наступні схемою оновлення рядка.

Додано ще кілька властивостей для надання максимальної гнучкості сітці. AllowInserting дозволяє користувачам увімкнути або вимкнути функцію вставки повністю на періоди, коли сітка використовується в режимі лише читання або оновлення. InsertRowActive контролює стан за промовчанням рядка вставки і у разі true(істина) вимагає, щоб користувач натиснув кнопку "новий" для перемикання рядка вставки в стан редагування.

За наявності цих властивостей слід потурбуватися про фактичне створення рядка вставки. Раніше порожній рядок додавалася на першу сторінку результатів, що руйнувало колекцію Rows і псувало перегортання, тому був створений метод CreateChildControls, який ASP.NET викликає при створенні елемента керування на сервері і створює всі дочірні елементи управління всередині сітки з урахуванням джерела даних, налаштувань розбиття на сторінки тощо. Довелося використовувати пару допоміжних методів, CreateRow і CreateColumns, щоб створити рядок вставки та комірки всередині неї. За наявності рядка треба було додати її до таблиці сітки – готове.

Виникла одна складність: за відсутності рядків за промовчанням сітка нічого не відображає, тому довелося створювати порожню таблицю, якщо сітка порожня. Також було додано кілька додаткових перевірок вже перевизначений метод InitializeRow, щоб переконатися, що кнопка вставки з'являлася тільки на рядку вставки, і що в рядку вставки не було нічого дурного, наприклад, кнопки видалення. Цей код опущено у статті для стислості.

Ще не кінець. Остання частина завдання – код для фактичного виконаннявставки. Це робиться шляхом перевизначення методу OnRowCommand дії відповідно до подій. Коли користувач натискає кнопку "Новий", треба скасувати всі редагування, а при запуску редагування показується кнопка "Новий" - ці два відіграють роль перемикача, так що користувач вставляє рядок або редагує рядок, але ніколи одночасно і те й інше. При натисканні користувачем кнопки "Вставити" значення витягуються з рядка вставки і порушується подія RowInserting. Якщо сітка пов'язана з джерелом даних – викликається його метод вставки, щоб легко виконався повний набір операцій створення, читання, оновлення, видалення.

Дуже спритний DataSourceView робить асинхронну вставку, тому якщо база даних повільна, решта сторінки отримує можливість відобразитися під час її виконання. Як і більшість асинхронних операцій, зворотний виклик викликає метод RowInserted і надає такий самий механізм обробки винятків, як і операції оновлення і видалення.

Це завершує клас ExtendedGridView, який можна помістити на будь-яку сторінку та використовувати так само, як GridView, та дає легкий спосіб використання сітки для зберігання табличних даних. Якщо ви раніше застосовували GridView для здійснення оновлень та видалень, то просто використовуєте для ExtendedGridView для виконання вставок. До GridView застосуємо такий самий компроміс: якщо ви задоволені базовими функціями і скрізь використовуєте BoundColumns, то можете робити все без написання коду, але якщо починаєте застосовувати TemplateColumns для зміни поведінки, то доводиться трохи більше доопрацьовувати самостійно. Тим не менш, розглянутий компонент заощаджує час і позбавляє проблем.

Цікаві особливості

У ході створення розглянутого управителяелемента було багато про внутрішню роботу керуючого елемента GridView. Класам, що розширюють GridView, надається ряд цікавих методів, у тому числі InitializePager, InitializeRow, CreateRow та CreateColumns. Це чудовий приклад того, як розширення керуючого елемента заощаджує час при реалізації однакових функцій у кількох місцях.