Разширен GridView с функция за вмъкване - всичко за ИТ и програмиране
СЪДЪРЖАНИЕ
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, за да промените поведението, тогава трябва да направите малко повече персонализиране сами. Въпреки това разглежданият компонент спестява време и елиминира проблемите.
Интересни функции
При създаването на разглеждания мениджърelement научи много за вътрешната работа на контролата GridView. Класовете, които разширяват GridView, предоставят редица интересни методи, включително InitializePager, InitializeRow, CreateRow и CreateColumns. Това е чудесен пример за това как разширяването на контрола спестява време при прилагане на една и съща функционалност на множество места.