Discussion:
UserControl mit Container
(zu alt für eine Antwort)
Olaf Dregel
2009-07-18 06:25:54 UTC
Permalink
Guten morgen,
ich habe eine Usercontrol als Container erzeugt.

<Designer("System.Windows.Forms.Design.ParentControlDesigner,
System.Design", GetType(IDesigner))> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class TestControl
Inherits .....

Das funktioniert. Aber mein Problem:
Im Usertrol ist bereits ein Panel enthalten - und in diesen sollen neu
aufzunehmende Controls platziert werden, und nicht im eigentlichen
UserControl.
Wie kann man das erreichen?

besten dank
es grüßt olaf
Peter Götz
2009-07-18 08:55:12 UTC
Permalink
Hallo Olaf,
Post by Olaf Dregel
ich habe eine Usercontrol als Container erzeugt.
<Designer("System.Windows.Forms.Design.ParentControlDesigner,
System.Design", GetType(IDesigner))> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class TestControl
Inherits .....
Im Usertrol ist bereits ein Panel enthalten - und in diesen
sollen neu aufzunehmende Controls platziert werden, und
nicht im eigentlichen UserControl.
Wie kann man das erreichen?
Dein UserControl ist ein Container, der eine Controls-
Auflistung hat. Dein Panel ist also in der Controlsauflistung
Deines UserControls enthalten.

Wie das UserControl hat auch das Panel eine Controls-
auflistung und dieser kannst Du beliebige Controls
hinzufügen.

Am folgenden Beispiel kannst Du die Sache mit den Controls-
auflistungen der verschiedenen Container verfolgen.
Erst wird der Controlsauflistung der Form ein Panel
hinzugefügt und anschliessend der Controlsauflistung des
Panels eine Textbox.
Du kannst den Beispielcode einfach in ein leeres
Formmodul (Form1.vb) kopieren.

' /// Code in Form1.vb
Public Class Form1
Private WithEvents Panel1 As Panel
Private WithEvents Textbox1 As TextBox

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

Panel1 = New Panel
With Panel1
.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 20)

.BackColor = Color.Red

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom

End With
Me.Controls.Add(Panel1)

Textbox1 = New TextBox
With Textbox1
.Font = New Font("Arial", 12)

.SetBounds _
(5, 5, _
Panel1.ClientSize.Width - 10, _
.Height)

.Anchor = _
AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right

.Name = "Textbox1"
.Text = .Name
End With
Panel1.Controls.Add(Textbox1)

End Sub
End Class
' \\\ E N T E

Nach dem Programmstart siehst Du Deine Form
mit dem rot eingefärbten Panel und darauf eine
Textbox.

Beim Erstellen eines Usercontrols läuft das nicht anders
ab, nur ist dabei eben der äussere Container erst mal
keine Form, sondern eben Dein Usercontrol.

Im Designer erstellst Du erst Dein UserControl,
ziehst auf dieses Dein Panel und in dieses Panel
legst Du dann eine Textbox.

Wenn Du Dir danach den vom Designer erzeugten Code
in UserControl.Designer.vb ansiehst, dann sieht der fast
genauso aus, wie obiger Beispielcode.

In der Sub InitializeComponent() werden je eine Instanz
eines Panels und eine Instanz einer Textbox erzeugt.

Anschliessend wird der Controlsauflistung des Panels
die Textbox hinzugefügt:

Panel1.Controls.add (TextBox1)

und danach werden die Eigenschaften des Panels
und der Textbox mit den entspr. Werten versorgt.
Zum Schluss wird das Panel der ControlsAuflistung Deines
UserControls hinzuugefügt

UserControl1.Controls.add (Panel1)

Unter

www.gssg.de -> Visual Basic -> VB.net

findest Du eine Vielzahl von Beispielen, bei denen
Controls irgendwelchen Controlsauflistungen hinzugefügt
werden.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Olaf Dregel
2009-07-18 15:22:09 UTC
Permalink
Hallo Peter,
vielen Dank. So ähnlich habe ich das auch gelöst, indem ich die neuen
Controls einfach in den Container-panel schiebe.

Protected Overrides Sub OnControlAdded(ByVal e As
System.Windows.Forms.ControlEventArgs)
If e.Control Is pan_Container Then
MyBase.OnControlAdded(e)
Else
pan_Container.Controls.Add(e.Control)
End If
End Sub

Und zur Laufzeit funktioniert das auch alle wie gedacht.
Aber beim Designen (VS2008) kommt beim Einfügen eines z.B. Labels in das
Usercontrol der Fehler:

<"child" ist kein untergeordnetes Steuerelement dieses übergeordneten
Elements>

Ich finde nirgends eine Hinweis darauf, was damit gemeint sei.

grüße von olaf
Peter Götz
2009-07-18 16:05:07 UTC
Permalink
Hallo Olaf,
Post by Olaf Dregel
vielen Dank. So ähnlich habe ich das auch gelöst, indem
ich die neuen Controls einfach in den Container-panel
schiebe.
Ja, und das wärs dann auch schon, wenn Du das im
Designer machst. Irgendwelchen Code brauchst Du
dazu nicht schreiben. Das erledigt der Designer.
Post by Olaf Dregel
Protected Overrides Sub OnControlAdded(ByVal e As
System.Windows.Forms.ControlEventArgs)
If e.Control Is pan_Container Then
MyBase.OnControlAdded(e)
Else
pan_Container.Controls.Add(e.Control)
End If
End Sub
Wer oder was erstellt diesen Code?
Und warum?
Post by Olaf Dregel
Und zur Laufzeit funktioniert das auch alle wie gedacht.
Aber beim Designen (VS2008) kommt beim Einfügen
<"child" ist kein untergeordnetes Steuerelement dieses
übergeordneten Elements
Ich finde nirgends eine Hinweis darauf, was damit gemeint sei.
Da ich weder weiss, wie Dein Usercontrol aussieht, noch
wie Du Dein Label in dieses Usercontrol einfügst, kann ich
dazu nichts sagen.
Wie schon oben erwähnt, im Designer positionierst Du zuerst
Dein Panel auf dem Usercontrol, und innerhalb dieses Panels
kannst Du nun ein oder mehrere andere Controls ablegen.
Dazu brauchst Du keine einzige Zeile Code zu schreiben und
ich kann mir dabei auch nicht vorstellen, wie es dabei zu
dem von Dir erwähnten Problem mit dem Label kommen soll.

Ich vermute, Du hast mit dem Designer irgendwas zusammen-
geklickt, anschliessend den vom Designer erzeugten Code
in irgendeiner Weise (unpasssend) verändert und danach
versucht, im Designer wieder per Klick-Klack Controls wie
z.B. Dein Label hinzuzufügen und der Designer weiss nun
wg. des von Dir veränderten Codes nicht mehr was er zu
tun hat.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Olaf Dregel
2009-07-18 17:06:29 UTC
Permalink
Hallo Peter,
ich habe sicher das problem nicht genug beschrieben. Unten habe ich das
komplette control als code eingefügt. Ist wahrlich nicht viel.
Wenn ich dieses Control in einer Form platziere soll es weitere z.B. Label
aufnehmen.
Diese ziehe ich dann aus der Toolbox aufs Control. Dann kommt der genannte
Fehler.
Wie gesagt, der Label soll nicht in der Controls-Liste vom Usercontrol
selbst, sondern in dessen pan_Container aufgenommen werden.
Daher das Überschreiben von OnControlAdded. Aber vielleicht geht das auch
gar nicht.

viele grüße

-------------------- CONTROL -------------------------------
Imports System.ComponentModel
Imports System.ComponentModel.Design

<Designer("System.Windows.Forms.Design.ParentControlDesigner,
System.Design", GetType(IDesigner))> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class MyContainerControl
Inherits System.Windows.Forms.UserControl
Friend WithEvents pan_Container As System.Windows.Forms.Panel

Private Sub InitializeComponent()
Me.pan_Container = New System.Windows.Forms.Panel
Me.SuspendLayout()
'pan_Container
Me.pan_Container.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top
Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right),
System.Windows.Forms.AnchorStyles)
Me.pan_Container.BorderStyle =
System.Windows.Forms.BorderStyle.FixedSingle
Me.pan_Container.Location = New System.Drawing.Point(10, 10)
Me.pan_Container.Name = "pan_Container"
Me.pan_Container.Size = New System.Drawing.Size(484, 243)
Me.pan_Container.TabIndex = 0
'MyContainerControl
Me.Controls.Add(Me.pan_Container)
Me.Name = "MyContainerControl"
Me.Size = New System.Drawing.Size(505, 264)
Me.ResumeLayout(False)
End Sub

Protected Overrides Sub OnControlAdded(ByVal e As
System.Windows.Forms.ControlEventArgs)
If e.Control Is pan_Container Then
MyBase.OnControlAdded(e)
Else
pan_Container.Controls.Add(e.Control)
End If
End Sub
End Class



------------------------------------------------------------------------------
Post by Peter Götz
Hallo Olaf,
Post by Olaf Dregel
vielen Dank. So ähnlich habe ich das auch gelöst, indem
ich die neuen Controls einfach in den Container-panel
schiebe.
Ja, und das wärs dann auch schon, wenn Du das im
Designer machst. Irgendwelchen Code brauchst Du
dazu nicht schreiben. Das erledigt der Designer.
Post by Olaf Dregel
Protected Overrides Sub OnControlAdded(ByVal e As
System.Windows.Forms.ControlEventArgs)
If e.Control Is pan_Container Then
MyBase.OnControlAdded(e)
Else
pan_Container.Controls.Add(e.Control)
End If
End Sub
Wer oder was erstellt diesen Code?
Und warum?
Post by Olaf Dregel
Und zur Laufzeit funktioniert das auch alle wie gedacht.
Aber beim Designen (VS2008) kommt beim Einfügen
<"child" ist kein untergeordnetes Steuerelement dieses
übergeordneten Elements
Ich finde nirgends eine Hinweis darauf, was damit gemeint sei.
Da ich weder weiss, wie Dein Usercontrol aussieht, noch
wie Du Dein Label in dieses Usercontrol einfügst, kann ich
dazu nichts sagen.
Wie schon oben erwähnt, im Designer positionierst Du zuerst
Dein Panel auf dem Usercontrol, und innerhalb dieses Panels
kannst Du nun ein oder mehrere andere Controls ablegen.
Dazu brauchst Du keine einzige Zeile Code zu schreiben und
ich kann mir dabei auch nicht vorstellen, wie es dabei zu
dem von Dir erwähnten Problem mit dem Label kommen soll.
Ich vermute, Du hast mit dem Designer irgendwas zusammen-
geklickt, anschliessend den vom Designer erzeugten Code
in irgendeiner Weise (unpasssend) verändert und danach
versucht, im Designer wieder per Klick-Klack Controls wie
z.B. Dein Label hinzuzufügen und der Designer weiss nun
wg. des von Dir veränderten Codes nicht mehr was er zu
tun hat.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Peter Götz
2009-07-20 08:43:10 UTC
Permalink
Hallo Olaf,
Post by Olaf Dregel
ich habe sicher das problem nicht genug beschrieben.
Ich vermute eher, Du hast das Beispiel aus meinem
vorigen Posting nicht gelesen oder zumindest nicht
verstanden.
Wenn Du ein Label auf Deinem Panel ablegen willst,
dann musst Du dieses Label der Controls-Auflistung
dieses Panels hinzufügen

DeinPanel.Controls.Add(DeinLabel)

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Lesen Sie weiter auf narkive:
Suchergebnisse für 'UserControl mit Container' (Fragen und Antworten)
10
Antworten
Ordner mit Passwort?
gestartet 2008-01-28 06:18:42 UTC
sicherheit
Loading...