左側の「Panel1」でユーザーが描画したリストボックス コントロールをホストする SplitContainer で構成される C# WinForms 'ListboxPanelControl' UserControl があります。SplitContainer の右側の「Panel2」は、項目がリストボックスに追加されると追加されるパネルをホストします。そのため、設計時のユーザーが最初の項目をリストボックスに追加すると、関連付けられたパネルが SplitContainer の「Panel2」に追加されます。リストボックスに 2 番目の項目が追加されると、2 番目のパネルが SplitContainer の「Panel2」に追加されます。次に、ユーザーがリストボックス項目を選択すると、関連するパネルが右側に表示されます。
この問題は、ユーザーがコントロール (ボタンなど) をツールボックスから現在アクティブな右側のパネル (現在選択されているリストボックス項目に対応するパネル) にドラッグ アンド ドロップしたときに発生します。プログラムで適切な Panel の Controls コレクションに追加しましたが、Microsoft Visual Studio IDE 内で「'子' はこの親の子コントロールではありません」というエラーが発生します。
私は問題を調査し、「別のコントロールの子であるコントロールが、デザイン時にコントロールをドロップすることを受け入れる方法」を示すいくつかの有用な記事を発見しました。例: http://www.codeproject.com/記事/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;
}
}
次に、ListBoxPanelControl の「OnControlAdded」イベントで、現在アクティブなパネルの「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 UserControl に Control を追加できた人はいますか?ここで、Control をホストしているターゲット自体が子 Control であり、UserControl 自体が動的でオンザフライで構築されている場合は?
ヘルプ/洞察をありがとう!トニー。