2010-12-15 61 views
0

Je suis nouveau en C# mais je ne suis pas nouveau en matière de codage - je le fais depuis presque deux décennies - et j'ai un problème avec les propriétés d'un contrôle personnalisé que je construis, qui hérite d'un Panel. Lorsque je mets mes propriétés, je peux les voir dans la liste des propriétés de Designer et même les définir, mais lors de l'exécution de ma petite application, il semble que ces valeurs de propriétés ne sont pas utilisées. De même si je change une propriété par programmation: pas d'erreur mais mon contrôle ne fait rien, c'est comme s'ils n'étaient pas correctement positionnés. Cependant, si je le fais par programme en classe, ils fonctionnent. Ma conjecture est que quelque chose dans mes propriétés set/get stuff n'est pas correct. S'il vous plaît voir le morceau de code suivant la façon dont je le fais:Pourquoi les propriétés de mon contrôle ne changeront pas en dehors de sa classe?

public class ColorStrip : Panel 
{ 
    // properties 
    // ------------------------------------------ 
    // size of color clusters (boxes) 
    private int _clusterSize = 20; 
    // controls if show the buttons panel 
    private Boolean _showButtons; 

    // property setters/getters 
    // ------------------------------------------ 
    // clusterSize... 
    public int clusterSize 
    { 
     get { return _clusterSize; } 
     set { _clusterSize = value; } 
    } 
    // showButtons... 
    public Boolean showButtons 
    { 
     get { return _showButtons; } 
     set { Console.Write(_showButtons); _showButtons = value; } 
    } 
    .... 

Donc, dans ma forme, par exemple dans la charge ou même dans un événement de clic quelque part, si je mets colorStrip1.showButtons = false; ou colorStrip1.showButtons = true; quelquechose (colorStrip1 serait le nom de l'instance après avoir placé le contrôle dans le formulaire en mode design) ... console.write dit toujours 'false'; Même si je le place dans la liste des propriétés de conception comme 'vrai', il ne reflétera pas la valeur établie, même si je l'ai par défaut à vrai, il ne changera jamais à l'extérieur. Des idées? Non des méthodes n'obtiennent pas la valeur de la propriété nouvelle et réglée à l'extérieur non plus, évidemment la chose getter/setter ne fonctionne pas. Il me semble que je ne fais pas exactement comme je l'ai défini ou obtenir mes propriétés en dehors de la classe. Ca ne marche qu'à l'intérieur, comme un charme ... Toute aide ... très appréciée!

Vive

lithium

P.S. POUR CLARIFIER LA SOLUTION:

Définition de la propriété dans ce cas ne fonctionne pas parce que je tentais d'utiliser une nouvelle valeur définie dans le constructeur, qui semble ne peut pas obtenir les nouvelles valeurs car il est, bien, bâtiment la chose. Si modifiez la valeur de la propriété en mode Conception> Editeur de propriétés ou dans le code externe de l'objet, par exemple dans son événement de chargement, il sera modifié mais lisible pour toutes les méthodes sauf le constructeur, bien sûr :)

+0

Existe-t-il plusieurs threads obtenant et définissant les propriétés? Pouvez-vous nous donner le code de test? – DVD

+1

Gardez à l'esprit que vous écrivez la valeur * old * de '_showButtons' - si vous faites deux séries à la suite, voyez-vous la nouvelle valeur? –

+1

Notez que les propriétés dans .NET * doivent être nommées en utilisant pascal-case, c'est-à-dire que la première lettre doit être en majuscule. – Lucero

Répondre

1

Il est probablement une question de l'ordre d'exécution. Votre régleur de propriété définit simplement une variable, mais ne déclenche rien sur le contrôle pour mettre à jour l'état lié à cette variable (par exemple en ajoutant ou en montrant les boutons que je suppose).

Lorsque vous définissez la propriété avant que le reste de l'initialisation ne soit effectué, la valeur est utilisée, sinon ce n'est pas parce que lors de l'initialisation, la valeur par défaut reste la valeur de la propriété.

Vous devez agir sur le poseur, voici quelques pseudocode pour illustrer:

set { 
    _showButtons = value; 
    if (alreadyInitialized) { 
    UpdateButtons(); 
    } 
} 

Remarque: assurez-vous d'abord définir la valeur, puis agir - sinon vous finissez par utiliser l'ancienne valeur (tout comme votre Console.Write() fait).

+0

Bon je ne vais pas aller plus loin en implémentant quoi que ce soit avec cette propriété mais seulement la lire dans le constructeur et dans une fonction que le constructeur appelle: il faut charger un fichier txt avec la couleur code et commencez à ajouter des groupes de couleurs --colored panels-- mais le départ à gauche devrait être différent si showButtons est vrai ou faux - si vrai, le départ à gauche pour les groupes de couleurs devrait être 100 pixels, sinon false 0 – litium258

+0

Oui! c'était en fait un ordre d'exécution ... J'ai trouvé le problème: si j'essaie d'accéder à mes propriétés dans le constructeur, les valeurs ne seront pas mises en externe ni en utilisant l'éditeur de propriétés Design et je suppose que: l'objet n'est pas prêt à ce moment. Oh, idiot moi! Si j'essaie d'accéder aux propriétés dans une autre méthode, cela fonctionne. Merci tout le monde! - et merci dieu j'ai fait une sieste! - – litium258

0

Le code cité ne semble pas problématique. Êtes-vous sûr de référencer la même instance de ColorStrip? Vérifiez également votre fichier .Designer.cs pour vous assurer que le code définissant la propriété est présent.

En fait, essayez de simplifier votre code en utilisant des propriétés auto mise en œuvre:

public int clusterSize { get;set;} 
public Boolean showButtons {get;set;} 

public ColorStrip() { ... clusterSize = 20; ... }