Попытка выяснить, как разрешить пользователю редактировать коллекцию с помощью DataGrid - PullRequest
0 голосов
/ 16 июля 2009

Я работаю над плагином для программы 3D-моделирования, чтобы помочь в архитектурном дизайне. У меня есть класс Building , который должен содержать коллекцию Этажей .

Класс

Мой Этаж имеет такие свойства, как Высота , Высота , Тип программы (жилой, розничный и т. Д.) И ID . Каждое здание имеет свойство FloorList , которое представляет собой совокупность всех Этажей , содержащихся в Building . Свойства Building обычно просматриваются через элемент управления сеткой свойств, и я планировал использовать пользовательский UITypeEditor , чтобы позволить пользователю редактировать коллекцию FloorList .

Я пытаюсь найти лучший способ создать этот класс коллекции FloorList , чтобы создание UITypeEditor было как можно проще, и я могу воспользоваться любым существующим Возможность редактирования коллекции в элементах управления .NET. Для редактора, который я думал, я бы использовал представление DataGrid, чтобы показать все этажи в коллекции, как в таблице ниже.

Height    Elevation     ProgramType    ID
15'       70'           Residential    23423
15'       55'           Residential    42342
15'       40'           Residential    98723
20'       20'           Retail         23454
20'       0'            Retail         98723

Пользователь должен иметь возможность редактировать высоту пола с помощью DataGrid, но высота этажа будет получена из суммы высот пола под ним. Тип программы должен быть текстовым полем или раскрывающимся списком, а идентификатор - это значение только для чтения, отображаемое только для информации.

Интерфейс также должен позволять пользователю редактировать элементы коллекции, такие как добавление одного или нескольких этажей, удаление одного или нескольких этажей или изменение порядка этажей.

Элемент управления DataGrid имеет некоторые встроенные функции, позволяющие пользователю добавлять и удалять строки, но есть ли встроенные функции, позволяющие пользователю изменять порядок строк?

Единственный раз, когда я использовал DataGrid , это показ DataTable . Есть ли прямой способ использовать элемент управления DataGrid , чтобы позволить пользователю видеть и редактировать свойства объектов в коллекции? Как насчет возможности добавлять и удалять объекты из этой коллекции, добавляя или удаляя строки из DataGrid ?

У меня есть одна оговорка: я не могу просто редактировать элементы коллекции напрямую, так как изменения одного элемента повлияют на другой. Например, если я уберу пол, мне нужно будет сдвинуть (изменить высоту) все этажи выше удаленного этажа. Аналогично, если я увеличу высоту пола, мне нужно будет переместить все этажи выше более высокого этажа. Таким образом, любые изменения в коллекции или элементах в коллекции должны быть сделаны через саму коллекцию, а не непосредственно в элементе.

Итак, я снова подумал, что моя коллекция FloorList будет реализовывать IEnumerable , чтобы другие методы могли проходить по всем этажам здания. Но любые фактические манипуляции с коллекцией или объектами в коллекции будут выполняться с помощью таких методов коллекции, как ....

FloorList.AddFloor(Floor floorToAdd);
FloorList.RemoveFloor(Floor floorToRemove);
FloorList.MoveFloor(Floor floorToMove,int newPosition);
FloorList.ChangeFloorHeight(Floor floor);
etc..etc...etc..

Извините за длинный вопрос, особенно без примера кода. Но сейчас у меня действительно нет никакого написанного кода, потому что я на этот раз пытаюсь планировать свою работу, а не прыгаю прямо в код.

Обновление

Я читал несколько примеров, и похоже, что DataGrid покажет свойства объектов в IList . Так что теперь я думаю, что имеет смысл реализовать List, но настроить переопределенные методы для обработки изменения высот этажа. Если в конечном итоге я собираюсь связать этот список с элементом управления DataGrid , было бы лучше создать базу FloorList из BindingList или IBindingList вместо?

Обновление

Я прочитал немного и решил полностью перефразировать мой вопрос. Новая версия здесь .

1 Ответ

0 голосов
/ 16 июля 2009

Чтобы ответить на ваш первый вопрос: на вашем бизнес-уровне у меня будут методы Create, Add, Edit, Delete (и т. Д.), Которые обрабатывают всю вашу пользовательскую логику (просто передайте ее в эти модели этим методам). Затем вызовите эти методы с помощью событий OnEditing, OnUpdating и т. Д. Из DataGrid.

Чтобы ответить на ваш второй вопрос, BindingList даст вам встроенное событие OnChange, тогда как List - нет. Если это используется в приложении Windows Form, BindingList пригодится. Но использование этого события в веб-приложении может быть довольно проблематичным. Это зависит от того, как вы хотите реализовать логику обновления на бизнес-уровне.

...