IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Design time, UserControl parameters


Sujet :

Windows Forms

  1. #1
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut Design time, UserControl parameters
    Bonjour

    J'ai un UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class MyControl : UserControl
    {
       public Control MyContainer {get;set;}
    }
    Lorsque j'ajoute mon UserControl via le designer dans un formulaire, j'aimerais voir apparaître la propriété MyContainer et lui affecter "This" dans le Form.Designer.cs,
    pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ... code généré par VS ...
    // 
    // myControl1 
    // 
    this.myControl1.MyContainer = This; // <-- /* ICI */
    this.myControl1.Location = new System.Drawing.Point(12, 12);
    this.myControl1.Name = "myControl1 ";
    this.myControl1.Size = new System.Drawing.Size(817, 1);
    this.myControl1.TabIndex = 33;
    this.myControl1.Titre = "Titre du formulaire";
    ...
    DefaultValueAttribute ne fonctionne que pour des constantes, il ne marche pas dans mon cas.
    Une idée ?
    Merci

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    si c'est une prop de type Control elle apparait dans le grid de propriete ,si elle initialisee ...
    Ensuite on peut lui affecter evidemement une "instance" de control existante:soit UC1,soit Form1 accessible via le designer...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
      public partial class MonUC : UserControl
        {
            public MonUC()
            {
                InitializeComponent();
                MyContainer = new Control();
                nomValue = "usercontrol actuel";
                numeroValue = 200;
            }
            public Control MyContainer { get; set; }
            private string nomValue;  
            public string  Nom 
            {
                get { return nomValue; }
                set { nomValue = value; }
            }
            private int numeroValue; 
            public int Numero 
            {
                get { return numeroValue; }
                set { numeroValue = value; ; }
            }
        }
    Une fois qu'on affecte à la prop MyContainer dans le designer l'instance actuelle de MonUC l'affectation est serialize par le Designer de VS correctement comme suit -extrait du code du designer -:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
       #region Windows Form Designer generated code
     
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.monUC1 = new WinListeVecteur.MonUC();
                this.SuspendLayout();
                // 
                // monUC1
                // 
                this.monUC1.BackColor = System.Drawing.Color.Red;
                this.monUC1.Location = new System.Drawing.Point(35, 20);
                //ici=>
                this.monUC1.MyContainer = this.monUC1;
                this.monUC1.Name = "monUC1";
                this.monUC1.Nom = "usercontrol actuel";
                this.monUC1.Numero = 200;
                this.monUC1.Size = new System.Drawing.Size(232, 234);
                this.monUC1.TabIndex = 0;
                // 
                // Form2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.monUC1);
                this.Name = "Form2";
                this.Text = "Form2";
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private MonUC monUC1;
    Evidemment si tu affectes à la prop MyContainer dans le designer l'instance actuelle du Form (dans mon exemple c'est le Form2) l'affectation est serialize par le Designer de VS correctement comme suit -extrait du code du designer -:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
       #region Windows Form Designer generated code
     
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.monUC1 = new WinListeVecteur.MonUC();
                this.SuspendLayout();
                // 
                // monUC1
                // 
                this.monUC1.BackColor = System.Drawing.Color.Red;
                this.monUC1.Location = new System.Drawing.Point(35, 20);
                this.monUC1.MyContainer = this;
                this.monUC1.Name = "monUC1";
                this.monUC1.Nom = "usercontrol actuel";
                this.monUC1.Numero = 200;
                this.monUC1.Size = new System.Drawing.Size(232, 234);
                this.monUC1.TabIndex = 0;
                // 
                // Form2
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.monUC1);
                this.Name = "Form2";
                this.Text = "Form2";
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private MonUC monUC1;
    Je ne vois pas le souci....et le but de cette operation meme m'echappe...!!!

  3. #3
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    Merci pour la réponse, mais cela ne m'aide pas.
    Je ne vois pas le souci....et le but de cette operation meme m'echappe...!!!
    Le but est le suivant :
    - Le UserControl se situe dans une dll inaccessible par les développeurs.
    - Lorsque le développeur fait un glisser/déposer du UserControl dans son formulaire, je veux que le designer ajoute tout seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.myControl1.MyContainer = This;
    // This = Formulaire du developpeur.
    Actuellement sans attribut 'DesignerSerializationVisibility' le designer ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.myControl1.MyContainer = null;
    La propriété 'MyContainer' n'est pas une propriété 'Browsable' ([Browsable(false)]). Le développeur ne doit pas savoir que le designer à affecté la valeur de la propriété 'MyContainer'.

    En d'autre terme, je souhaite le même comportement que le composant 'ErrorProvider'.
    Lorsqu'on ajoute le composant au formulaire on obtient dans le designer.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     // 
                // errorProvider1
                // 
                this.errorProvider1.ContainerControl = this;

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Le code source de l'errorprovider ça te donnera peut être la solution :
    http://referencesource.microsoft.com...rorProvider.cs

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    rebonjour

    Il faut solliciter le Designer dans les get et set de ton control MyContainer ...
    1/ Pour lui affecter l 'instance du Form host (Formulaire) courant
    2/ Veiller à ce que sa valeur ne soit changer au Run-Time car les developpeurs peuvent y acceder par
    "code" meme si elle n'est pas visible en design-time (browsable à false)...

    voici le code de l' UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.ComponentModel.Design;
     
    namespace WinUserControlDesignMode
    {
        public partial class MonUC : UserControl
        {
     
            public MonUC()
            {
                InitializeComponent();
                nomValue = "usercontrol actuel";
                numeroValue = 200;
                this.BorderStyle = BorderStyle.FixedSingle;
                this.BackColor = Color.Red;
            }
            private Control containerValue = null;
            public Control MyContainer
            {
                // Used to populate InitializeComponent at design time
                get
                {
                    if (containerValue == null && this.DesignMode)
                    {
                        // Access designer host and obtain reference to root component
                        IDesignerHost designer = (IDesignerHost)this.GetService(typeof(IDesignerHost));
     
                        // Access designer host and obtain reference to root component
                        if (designer != null)
                        {
                            containerValue = (Form)designer.RootComponent;
     
                        }
     
     
                    }
                    return containerValue;
     
     
                }
                set
                {
                    if (!this.DesignMode)
                    {
                        //' Don't change hosting form at run time
                        if (containerValue != null && containerValue != value)
                        {
     
                            throw new InvalidOperationException("Cannot  set HostingForm at run time.");
                        }
                        else
                        {
                            containerValue = value;
                        }
                    }
                }
            }
     
            private string nomValue;
            public string Nom
            {
                get { return nomValue; }
                set { nomValue = value; }
            }
            private int numeroValue;
            public int Numero
            {
                get { return numeroValue; }
                set { numeroValue = value; ; }
            }
        }
    }
    et le code du form utilisateur et l'exception levee si on tente de modifier la prop MyContainer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinUserControlDesignMode
    {
        public partial class Form1 : Form
        {
            private Form2  frm = new Form2(); 
            public Form1()
            {
                InitializeComponent();
                this.Text = this.monUC1.MyContainer.ToString();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
                this.monUC1.MyContainer = frm;
                frm.Text = this.monUC1.MyContainer.ToString();
     
            }
        }
    }
    bon code...

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    rebonjour

    Il faut solliciter le Designer dans les get et set de ton control MyContainer ...
    1/ Pour lui affecter l 'instance du Form host (Formulaire) courant
    2/ Veiller à ce que sa valeur ne soit changer au Run-Time car les developpeurs peuvent y acceder par
    "code" meme si elle n'est pas visible en design-time (browsable à false)...

    voici le code de l' UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.ComponentModel.Design;
     
    namespace WinUserControlDesignMode
    {
        public partial class MonUC : UserControl
        {
     
            public MonUC()
            {
                InitializeComponent();
                nomValue = "usercontrol actuel";
                numeroValue = 200;
                this.BorderStyle = BorderStyle.FixedSingle;
                this.BackColor = Color.Red;
            }
            private Control containerValue = null;
            public Control MyContainer
            {
                // Used to populate InitializeComponent at design time
                get
                {
                    if (containerValue == null && this.DesignMode)
                    {
                        // Access designer host and obtain reference to root component
                        IDesignerHost designer = (IDesignerHost)this.GetService(typeof(IDesignerHost));
     
                        // Access designer host and obtain reference to root component
                        if (designer != null)
                        {
                            containerValue = (Form)designer.RootComponent;
     
                        }
     
     
                    }
                    return containerValue;
     
     
                }
                set
                {
                    if (!this.DesignMode)
                    {
                        //' Don't change hosting form at run time
                        if (containerValue != null && containerValue != value)
                        {
     
                            throw new InvalidOperationException("Cannot  set HostingForm at run time.");
                        }
                        else
                        {
                            containerValue = value;
                        }
                    }
                }
            }
     
            private string nomValue;
            public string Nom
            {
                get { return nomValue; }
                set { nomValue = value; }
            }
            private int numeroValue;
            public int Numero
            {
                get { return numeroValue; }
                set { numeroValue = value; ; }
            }
        }
    }
    et le code du form utilisateur et l'exception levee si on tente de modifier la prop MyContainer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinUserControlDesignMode
    {
        public partial class Form1 : Form
        {
            private Form2  frm = new Form2(); 
            public Form1()
            {
                InitializeComponent();
                this.Text = this.monUC1.MyContainer.ToString();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.Show();
                this.monUC1.MyContainer = frm;
                frm.Text = this.monUC1.MyContainer.ToString();
     
            }
        }
    }
    bon code...

Discussions similaires

  1. Design-time : redimensionner un usercontrol
    Par Yoshio dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/04/2008, 10h08
  2. Reflection durant le design time
    Par Jérôme Lambert dans le forum C#
    Réponses: 8
    Dernier message: 11/07/2007, 16h41
  3. [ASP 2.0]Modifs Propriété ascx Design time
    Par chnew dans le forum ASP.NET
    Réponses: 6
    Dernier message: 12/06/2007, 09h30
  4. [D7] Menu d'un composant à design time
    Par Herk77 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/11/2006, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo