2016-03-21 46 views
0

我有一個datagridview顯示我的集合中的所有對象。顯示的對象位於基類中。但實際上有8個不同的派生類。VB.NET傳遞對象到新窗口形式

對於用戶添加對象特定信息到對象,我打開一個新表單,當用戶雙擊行Dim x As New Cylinder_formx.Show()將有額外的字段添加特定的信息。

我現在的問題是,如何通過雙擊用戶到新窗體來傳遞選定的對象?我不知道如何做到這一點。首先,我認爲這將有點像使用潛艇和功能ByvalByref。或者我可以製作一個公共變量來保存所選對象並從我的新表單中引用該變量?

這樣做最常見的做法是什麼?

Datagridview control

+1

將您的行底層的對象傳遞給Form構造函數中的新窗體,將它放在窗體一側並將其用於編輯。這裏沒有什麼新東西,如果你只是用'傳遞對象到另一個表單'進行搜索 – Steve

+1

如果你有8個不同的類,那麼你可能應該有8個不同的形式。每一個都可以編輯這樣的類的屬性。這是最直接的解決方案。尋找縮小該數字的方法,通過簡單地隱藏或禁用控件,表單可以編輯超過1個類。也許一個PropertyGrid足夠好。我們無法猜測。 –

+0

好的,謝謝你在'Sub Sub New()'中使用'Form構造函數'嗎? –

回答

2

,最簡單的解決方案,你的主要問題,通過幾種形式之間的對象,將一個實例化對象傳遞給編輯形式的構造函數,更改保存所有屬性,然後繼續正常。
例子:
在你的MainForm爲您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 

的例子僅顯示如何爲全新對象執行此操作,如果您已經擁有該對象(例如在您的數據網格中)並且只想對其進行編輯,請相應地調整代碼。

關於Hans Passant的建議propertygrid,請嘗試閱讀link on Code Project或嘗試查看msdn here

或者,如果您熟悉反射並希望對屬性窗體的光學外觀有更多影響,則可以使用反射來獲取圖形對象的所有公共屬性,並在純粹的編程方式,但是這當然取決於您的偏好,如果您相應地構建對象,通常屬性網格應該足夠。

你無論如何是否使用PropertyGrid的或反射,你可以做所有的人物在後記

2

一個窗口給出一個MustInherit基類的公共屬性,多個子類與道具更具體類型和BindingList到存儲它們並將它們顯示在DataGridViewPropertyGrid將很好地編輯這些。

爲此,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

如果你有一個完成按鈕,你可以添加此強制屬性刷新:

propGrid.SelectedObject = Nothing 
shapeList.ResetBindings() 

這使得這個極其簡單的事情是,編輯到PropertyGrid中的對象自動流轉到列表和DataGridView。你不必將對象傳遞給別的東西或設計特殊的形式。可以看出,您可以使用Attributes來控制顯示它的相當數量:有些是隻讀的,它們是分類的。任何「系統」屬性(如Id或可能是Index)都可以很容易地從視圖中隱藏起來。

如果您想要取消/放棄支撐網格編輯的方法,請克隆選定對象並顯示它,然後替換列表中的現有項目。

這也可以用來定義要添加的新形狀。當用戶從組合中選擇「新金字塔」時,創建一個並將其顯示在PropertyGrid中供他們編輯。完成後,將其添加到列表中以在DGV中顯示。