2016-03-21 3 views
0

У меня есть datagridview, который отображает все объекты в моей коллекции. Отображаемые объекты находятся в базовом классе. Но на самом деле существуют + - 8 разных производных классов.VB.NET передать объект в новую форму окна

Чтобы пользователь мог добавить объектную информацию к объекту, я открываю новую форму, когда пользователь дважды щелкает по строке Dim x As New Cylinder_formx.Show(), которая будет иметь дополнительные поля для добавления конкретной информации.

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

Что является наиболее распространенной практикой для этого?

Datagridview control

+1

Передайте объект, лежащий в основе вашей строки, в новую форму в конструкторе формы, получите его на стороне формы и используйте его для редактирования. Ничего нового здесь, если вы просто сделаете поиск с «передачей объектов в другую форму» – Steve

+1

Если у вас 8 различных классов, вы, вероятно, должны иметь 8 различных форм. Каждый из них делает свойства такого класса доступными для редактирования. Это самое прямолинейное решение. Ищите способы уменьшить это число, форма может быть в состоянии редактировать более одного класса, просто скрывая или отключая элемент управления. Возможно, PropertyGrid достаточно хорош. Мы не можем догадываться. –

+0

Хорошо, спасибо, «конструктор форм», который вы имеете в виду под «Public Sub New()»? –

ответ

2

Самое простое решение главной задачи, передавая объекты между несколькими формами, было бы передать экземпляра объекта в конструктор формы редактирования, изменить все свойства на сохранение и затем продолжится в обычном режиме.
Пример:
в вашем MainForm как Handler для вашего CylinderAdd:

Sub addCylinder() Handles btCylinder.Click 
     Dim cylinder As New Cylinder 
     Dim sw As New ShapeWindow(cylinder) 
     'blocks mainUI until edit is conformed 
     sw.showDialog() 
     'Use Object however you want in your mainform 
End Sub 

и в вашей форме, которая используется для установки свойств создаваемого конструктора, как это:

Sub New(obj As Cylinder) 
    ' This call is required by the designer. 
    InitializeComponent() 
    'use your shape if it had meaningful default values to initialize form fields 
End Sub 

На примере только показывает, как это сделать для совершенно нового объекта, если у вас уже есть объект (например, в вашем datagrid) и просто хотите его отредактировать, просто отредактируйте код соответствующим образом.

Что касается предложенного свойства gass of Hans Passant, попробуйте прочитать это link on Code Project или попробуйте взглянуть на msdn here.

В качестве альтернативы, если вы знакомы с работой с отражением и хотели бы немного повлиять на внешний вид формы свойств, вы можете использовать отражение, чтобы получить все общедоступные свойства объектов с фигурами и создать свой пользовательский интерфейс в чистый программный путь, но это зависит от ваших предпочтений, конечно, как правило, сетка свойств должна быть достаточной, если вы создадите свои объекты соответственно.

использовать Во всяком случае ли вы PropertyGrid или отражение вы можете сделать все фигуры в одном окне послесловия

2

Учитывая 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

Если у вас есть DONE кнопку, вы можете добавить его, чтобы заставить свойства обновить:

propGrid.SelectedObject = Nothing 
shapeList.ResetBindings() 

вещь, которая делает это чрезвычайно просто является то, что редактирование к объекту в PropertyGrid автоматически перетекает в список и DataGridView. Вам не нужно передавать объект на что-то другое или создавать специальные формы. Как можно видеть, вы можете контролировать справедливое количество того, как оно отображается с помощью Attributes: некоторые из них доступны только для чтения, и они классифицируются. Любые «системные» свойства, такие как Id или, возможно, индекс, также могут быть легко скрыты от просмотра.

Если вы хотите, чтобы отменить/отменить изменения сетки сетки, клонировать выбранный объект, отображать его и заменять существующий элемент в списке.

Это также можно использовать для определения новых фигур, которые нужно добавить. Когда пользователь выбирает «Новая пирамида» из Combo, создайте его и отобразите в PropertyGrid для редактирования. По завершении добавьте его в список для отображения в DGV.

Смежные вопросы