一個窗口給出一個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屬性,這樣每個對象都可以被唯一標識。
結果:
如果你有一個完成按鈕,你可以添加此強制屬性刷新:
propGrid.SelectedObject = Nothing
shapeList.ResetBindings()
這使得這個極其簡單的事情是,編輯到PropertyGrid中的對象自動流轉到列表和DataGridView
。你不必將對象傳遞給別的東西或設計特殊的形式。可以看出,您可以使用Attributes
來控制顯示它的相當數量:有些是隻讀的,它們是分類的。任何「系統」屬性(如Id或可能是Index)都可以很容易地從視圖中隱藏起來。
如果您想要取消/放棄支撐網格編輯的方法,請克隆選定對象並顯示它,然後替換列表中的現有項目。
這也可以用來定義要添加的新形狀。當用戶從組合中選擇「新金字塔」時,創建一個並將其顯示在PropertyGrid中供他們編輯。完成後,將其添加到列表中以在DGV中顯示。
將您的行底層的對象傳遞給Form構造函數中的新窗體,將它放在窗體一側並將其用於編輯。這裏沒有什麼新東西,如果你只是用'傳遞對象到另一個表單'進行搜索 – Steve
如果你有8個不同的類,那麼你可能應該有8個不同的形式。每一個都可以編輯這樣的類的屬性。這是最直接的解決方案。尋找縮小該數字的方法,通過簡單地隱藏或禁用控件,表單可以編輯超過1個類。也許一個PropertyGrid足夠好。我們無法猜測。 –
好的,謝謝你在'Sub Sub New()'中使用'Form構造函數'嗎? –