Учитывая MustInherit
базовый класс с общими свойствами, несколько дочерних классов с реквизитом для более конкретных типов и BindingList
к хранить их и отображать их в DataGridView
, PropertyGrid
будет отлично работать, чтобы редактировать их.
Для этого DGV отобразит их и, по-видимому, позволит пользователю переупорядочить их путем перетаскивания (в соответствии с предыдущим вопросом). Сохраняется как BaseShape
, тогда DGV не отображает более специфичные свойства типа, но может действовать как «Селектор».
Для этого вы можете использовать RowHeaderMouseDoubleClick
событие в качестве сигнала для редактирования этого элемента:
Dim shapeObj = CType(dgv.Rows(e.RowIndex).DataBoundItem, BaseShape)
Dim thisShape = shapeList.FirstOrDefault(Function(x) x.Index = shapeObj.Index)
If thisShape IsNot Nothing Then
propGrid.SelectedObject = thisShape
End If
Это использует свойство индекса, чтобы получить правильный элемент из основного списка, а затем отобразить его в PropertyGrid
. Я подозреваю, что Index
означает «Последовательность» и, возможно, они меняются, когда строки перетаскиваются и отбрасываются. Если это так, у меня также будет какое-то неизменяемое свойство ID, чтобы каждый объект мог быть однозначно идентифицирован.
Результат:
![enter image description here](https://i.stack.imgur.com/2BPfa.jpg)
Если у вас есть DONE кнопку, вы можете добавить его, чтобы заставить свойства обновить:
propGrid.SelectedObject = Nothing
shapeList.ResetBindings()
вещь, которая делает это чрезвычайно просто является то, что редактирование к объекту в PropertyGrid автоматически перетекает в список и DataGridView
. Вам не нужно передавать объект на что-то другое или создавать специальные формы. Как можно видеть, вы можете контролировать справедливое количество того, как оно отображается с помощью Attributes
: некоторые из них доступны только для чтения, и они классифицируются. Любые «системные» свойства, такие как Id или, возможно, индекс, также могут быть легко скрыты от просмотра.
Если вы хотите, чтобы отменить/отменить изменения сетки сетки, клонировать выбранный объект, отображать его и заменять существующий элемент в списке.
Это также можно использовать для определения новых фигур, которые нужно добавить. Когда пользователь выбирает «Новая пирамида» из Combo, создайте его и отобразите в PropertyGrid для редактирования. По завершении добавьте его в список для отображения в DGV.
Передайте объект, лежащий в основе вашей строки, в новую форму в конструкторе формы, получите его на стороне формы и используйте его для редактирования. Ничего нового здесь, если вы просто сделаете поиск с «передачей объектов в другую форму» – Steve
Если у вас 8 различных классов, вы, вероятно, должны иметь 8 различных форм. Каждый из них делает свойства такого класса доступными для редактирования. Это самое прямолинейное решение. Ищите способы уменьшить это число, форма может быть в состоянии редактировать более одного класса, просто скрывая или отключая элемент управления. Возможно, PropertyGrid достаточно хорош. Мы не можем догадываться. –
Хорошо, спасибо, «конструктор форм», который вы имеете в виду под «Public Sub New()»? –