Как разрешить моему пользовательскому элементу управления определять элементы управления в его родительской форме во время разработки?

Я хочу, чтобы мой пользовательский элемент управления определял (объявлял и инициализировал) элементы управления внутри своего родительского класса формы во время разработки. Например, пользовательский элемент управления (или связанный с ним класс конструктора) должен иметь возможность объявить панель «Panel1» в своей родительской форме следующим образом:

Partial Class Form1
Inherits System.Windows.Forms.Form

<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
      Me.MyUserControl1 = New MySolution.MyUserControl
      Me.Panel1 = New System.Windows.Forms.Panel
      Me.SuspendLayout()
      '          '
      'MyUserControl1
      '
      Me.MyUserControl1.Controls.Add(Me.Panel1)
      Me.MyUserControl1.Location = New System.Drawing.Point(50, 50)
      Me.MyUserControl1.Name = "MyUserControl1"
      Me.MyUserControl1.Size = New System.Drawing.Size(102, 102)
      Me.MyUserControl1.TabIndex = 0
      '
      'Panel1
      '
      Me.Panel1.Location = New System.Drawing.Point(1, 1)
      Me.Panel1.Name = "Panel1"
      Me.Panel1.Size = New System.Drawing.Size(100, 100)
      Me.Panel1.TabIndex = 1
      '
      'Form1
      '
      Me.ClientSize = New System.Drawing.Size(399, 262)
      Me.Controls.Add(Me.MyUserControl1)
      Me.Name = "Form1"
      Me.Text = "Form1"
      Me.ResumeLayout(False)
 End Sub

 Friend WithEvents MyUserControl1 As MySolution.MyUserControl
 Friend WithEvents Panel1 As System.Windows.Forms.Panel
End Class

ПРИМЕЧАНИЕ: это объявление должно быть динамическим. Я знаю, что могу добиться этого, добавив «Panel1» в качестве свойства в моем пользовательском элементе управления, но мне нужно добавить это объявление из кода, а не путем предоставления элемента в качестве свойства.

Среди встроенных элементов управления winforms, обладающих такой возможностью, есть, например, TabControl и ListView. Попробуйте этот сценарий: добавьте TabControl в форму в конструкторе, просмотрите созданный дизайнером файл формы, вы обнаружите, что TabPage1 и TabPage2 были объявлены и инициализированы в коде формы. Если вы добавите еще одну вкладку, а затем вернетесь к сгенерированному дизайнером файлу, вы обнаружите, что дизайнер TabControl добавил TabPage3 к определенным элементам, удалите эти TabPages из TabControl, и вы обнаружите, что связанные с ними объявления и инициализации удалены из файла. исходный код.

Как этого можно достичь из моего пользовательского элемента управления и / или его дизайнера? Спасибо за помощь.


person AbdulRahman    schedule 11.01.2015    source источник


Ответы (1)


Это возможно с помощью функции: IDesignerHost.CreateComponent в экземпляре интерфейса хоста дизайнера элемента управления, вызываемого из кода дизайнера элемента управления (sub initialize или любого другого метода, который действует как глагол). Это наглядный пример того, как это сделать в Visual Basic и C #, Автору большое спасибо.

person AbdulRahman    schedule 08.04.2015