我有一個C#WinForms的ListboxPanelControl'用戶控件,它由一個SplitContainer組成,該控件在左邊的'Panel1'中託管一個用戶繪製的Listbox控件。 SplitContainer的右側「Panel2」將託管在項目添加到列表框時添加的面板。因此,如果設計時用戶將第一項添加到列表框中,則將關聯的面板添加到SplitContainer的「Panel2」中。如果將第二項添加到列表框中,則將第二個面板添加到SplitContainer的「Panel2」中。然後,當用戶選擇列表框項目時,關聯的面板顯示在右側。在設計時將控件添加到我的「即時」用戶控件中。
問題出現在設計階段,當用戶從工具箱拖放控件(例如按鈕)到當前活動的右側面板(與當前選定的列表框項目對應的面板)時。我編程式地將它添加到適當的Panel Controls集合中,但是這會導致「'child'不是該父級的子控件」錯誤在Microsoft Visual Studio IDE中。
我研究這個問題,並發現了一些有用的文章顯示「如何讓一個控制,這是另一種控制的孩子接受其控制拖放到它在設計時」,例如:http://www.codeproject.com/Articles/37830/Designing-Nested-Controls
這將「DesignerSerializationVisibility」屬性與ControlDesigner的「EnableDesignMode」方法結合使用,以允許VS IDE處理將控件放置到另一個控件上。問題在於,在這種情況下,UserControl的目標託管控件已得到有效修復並且事先已知。 使用我的控件,可以在設計時將其他控件放置到其上的目標託管面板事先不知道,因爲我的UserControl本身可以「即時」構建(因爲用戶添加更多列表框項目導致更多潛在的託管小組)。
我試過以更靈活的方式使用「DesignerSerializationVisibility」和「EnableDesignMode」方法,但似乎碰到前面提到的'孩子不是這個父母的子控件'錯誤。
我希望這一切都有道理!?該代碼目前看起來是這樣的:
這是ListboxPanelControl類中: ...
[
Category("Appearance"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public Panel MainPanel
{
get
{
//Instead of returning a 'fixed' Panel we return whatever the currently
//active Panel is according to the currently selected Listbox item
if(mnCurrentlyActiveListBoxIndex >= 0)
{
ListBoxEntry lEntry = (ListBoxEntry)listBox.Items[mnCurrentlyActiveListBoxIndex];
return lEntry.RelatedPanel;
}
return null;
}
}
然後,在「OnControlAdded」事件在ListBoxPanelControl,我稱之爲「EnableDesignMode」(通過簡單的「SetDesignMode」包裝)爲當前活動面板,然後添加控件:
protected override void OnControlAdded(ControlEventArgs e)
{
...
mDesigner.SetDesignMode(MainPanel, "MainPanel" + mnCurrentlyActiveListBoxIndex.ToString());
ListBoxEntry lEntry = (ListBoxEntry)listBox.Items[mnCurrentlyActiveListBoxIndex];
lEntry.RelatedPanel.Controls.Add(e.Control);
e.Control.BringToFront();
e.Control.Refresh();
...
}
我希望我已經解釋的問題不夠清楚!基本上,有人設法將控制添加到他們的WinForms用戶控件,其中目標託管控件本身是一個子控件,並且當他們的用戶控件本身是動態的,並正在建造中?
感謝您的任何幫助/見解! Tony。
感謝。我正在處理類似的事情,這可能會有所幫助。一個簡單的說明:無論是否存在異常,您的finally塊都會執行。取消之後調用designerTransaction.Commit()是否可以? – TrespassersW
設計師主持人在哪裏發揮作用?你在哪裏執行這個代碼?它在設計師課上嗎? – ernest